String的length

本文讨论了Java中String类的length属性的本质,分析了它为何不是传统意义上的属性而是方法,并对比了不同编程语言如C#和Eiffel对此问题的处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java有一个叫做String的类,可以通过length得到String对象的长度。
现在我要问一个问题,三秒钟给出答案:
这个length是属性(Field)还是方法(Method)。
1、2、3。
你说是属性?
你确认你说的对么?我们可以int n = String.length;但是不可以String.length = n;Why?你见过那个类的某个属性只可读不可写过?
或许你能联想到JavaBean里面的某些规定。确实,有了JavaBean规范,我们可以实现这样一个可读不可写的Property。但问题是String不是一个JavaBean。所以,这里的String是一个不能用Java语言规范给出的类。
C# 的readonly给出了一个比较好的解决方案。但是也有瑕疵,问题在于如果我想修改这个Field,运行时就会阻止这件事情发生,当然,对于 Immutable型的类型来说似乎没有太大的危害,但是mutable型的类型就会有问题了,而且,支持Immutable型类型的语言如果没有GC的支持会非常的丑陋。所以,无论是Java还是C#,解决这个问题的办法不外是一套规范,一套规定如何读取和写入状态的机制。Java用JavaBean解决,C#用Propery解决。看起来很完美。
但是,它们都显得有点重量级,有必要么?C++/CLI甚至规定了更智能的Property方案。节省了大量的无聊的动作和死气沉沉的重复。这是一个明显的改进,但是似乎没有多少人欣赏。
注:实际上C++在很多方面可以说比Java、C#显得更高级,比如说析构的自动调用,这在C#中需要用using来指明,而Java中更是需要用 finally来实现。这导致了它们的哲学(看待世界的方法)的不同,RAII是C++里面自然的和有益的模式,在Java里面蜕化成try finally,更进一步的影响到Java的class的表达能力,不能用来表达资源(非托管型的)!当然,C++的这种包揽也让很多人觉得不爽,觉得控制的粒度不能更细致,以至于(在概念中)可能会影响表达能力。
还是返回到length问题上,这个问题就没有更好的办法了么?
我们从 Eiffel中发现了一种令人称奇的简单的难以置信的方案。那就是:所有的状态特征(Eiffel没有区分属性和方法,统一叫做特征),都是可以读不可以写的,所有的在别的语言中称作方法的那种行为特征分为两类,query和command,其中query跟状态特征一样,不会修改对象的状态,只会返回对象的状态,当然,这可能是通过过滤或者汇总统计之后的状态。而command是用来修改对象状态的那种行为特征。Eiffel甚至特意让没有参数的 query不用()来调用,使得用户没有办法区分query跟状态特征的区别。
这儿似乎让很多人迷惑,这怎么实现信息隐藏!?
哦,是啊,确实,没有办法实现。可是我们要考虑的另一个问题是:我们为什么要实现信息隐藏?
好多人都会立即列举出一大堆理由来,这是他们上软件工程课程的时候记熟了的。可是我要说的是,这一大堆的好处跟信息隐藏没有关系!下面我慢慢的说为什么。
信息存在在计算机空间的目的不是隐藏,而是展现。那为什么我们听熟了听惯了信息隐藏?我想这是一个词语的误用,我们要的是无关信息的隐藏,要的是实现细节的隐藏。细节的无关的信息隐藏对于计算机用户来说是有好处的,但是对于程序员来说,用户认为无关的细节的信息,很有可能恰恰是其关注的焦点信息。从另一个方面来说,我们可以区分出实现细节和用户关注点这两个方面。需要隐藏的是实现细节,而不是大而化之的信息。由于计算机空间内部也有可能是分阶层和等级的,所以,也可以区分出供应者和用户这样的关系,他们也是通过某种定义严格的接口(用户关注点)来隔离和交互的,实现的细节一样被隐藏起来。
说到这儿,很多人还是觉得没有说服力,他们坚持认为应该隐藏数据,而展现方法。怎么说服呢?我们想想Brooks在《人月神话》中怎么说的:给我流程图,我还是不明白,给我数据表格,一切都清楚了。这说明什么?说明人对于信息或者状态的感受能力强过对于操作流程的感受能力,人更能理解的是数据而不是方法。
如果方法是作为一个数据展现的间接层存在,我们也可以说它确实提供了某种程度的灵活性,可是,我们真的需要这种灵活性么?我们的大多数get* set*还不是堕落成为简单的赋值和返回?
<think>好的,用户想了解如何在TCL中计算字符串长度。首先我需要回忆TCL中处理字符串的相关命令。记得TCL的字符串操作主要使用`string`命令,而获取长度应该用`string length`。 接下来,我需要确认`string length`的具体用法。例如,基本语法是`string length $str`,其中`$str`是要测量的字符串变量。可能需要给出一个简单例子,比如`set str "Hello"`,然后`string length $str`会返回5。 另外,用户可能想知道直接处理字符串字面量的情况,比如`string length "Hello World"`应该返回11。需要注意TCL中变量替换的问题,比如如果字符串包含特殊字符或空格,是否需要引号包裹。例如,含有空格的字符串必须用引号括起来,否则会被当作多个参数,导致错误。 还要考虑中文字符的情况,比如一个包含中文的字符串,`string length`是否会正确计算字符数。在TCL中,`string length`是按字节计算还是按Unicode字符计算。例如,UTF-8编码的中文字符通常占3个字节,如果用户用`string length`可能会得到字节数而不是字符数,这时候可能需要使用`string bytelength`来区分。但根据TCL文档,`string length`返回的是字符数,而`string bytelength`返回字节数,所以需要明确说明这一点。 用户提供的引用内容中提到了`dc_shell_status`和一些其他命令,可能用户是在使用Design Compiler的TCL环境,但问题本身是关于纯TCL的字符串长度计算,所以不需要涉及这些引用内容,除非有特殊情况。但根据引用[1],可能用户是在特定的shell环境中,需要确认是否有差异,但一般来说,TCL的核心命令在各个环境中是一致的。 还需要检查是否有其他相关命令或常见错误。例如,如果用户忘记使用`$`符号引用变量,会导致错误。或者,如果字符串中包含特殊符号如`[`或`$`,需要正确转义,否则TCL会尝试解析它们,导致意外结果。例如,`string length "abc[def]"`可能会引发错误,除非使用大括号或反斜杠转义。 最后,生成相关问题时要考虑用户可能的后续问题,比如处理中文字符长度、性能考虑、其他字符串操作命令(如子字符串、替换等),以及如何避免常见错误。</think>在TCL中计算字符串长度需使用`string length`命令,该命令返回字符串的字符数量(注意中文按字符计算,而非字节)。以下是三种典型使用场景: $$ \text{字符串长度} = \text{string length \$string\_var} $$ **基础用法示例:** ```tcl set str "TCL编程" puts [string length $str] ;# 输出5(T C L 编 程共5个字符) ``` **含特殊字符的处理:** ```tcl set path "/usr/local/bin" puts [string length $path] ;# 输出13(路径字符串长度) ``` **直接测量字面量:** ```tcl string length "Design\Compile" ;# 输出13(反斜杠作为普通字符) ``` **注意点:** 1. 变量必须用`$`符号解引用 2. 包含空格或特殊符号时需用双引号包裹变量值 3. 中文字符按单个字符计算(与`string bytelength`区分,后者返回字节数) 引用[1]中提到的`dc_shell_status`变量虽与字符串操作无直接关联,但提示了TCL脚本中命令执行状态的获取方法,在编写带错误校验的字符串处理脚本时可作为补充[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值