不可变的Dot Net字符串

时间:2010-05-28 20:21:49

标签: .net string immutability

我通常在vb.net中将我的字符串变量定义为

Dim f_sName as string=String.Empty
f_sName = "foo"

鉴于.net中字符串的不可变性,是否有更好的方法来初始化字符串并处理“变量'f_sName'在它被赋值之前使用。空引用异常可能在运行时产生。”警告?

对于没有不接受任何参数的构造函数的类,如System.Net.Sockets.NetworkStream,定义和初始化该类型变量的最佳方法是什么?

3 个答案:

答案 0 :(得分:3)

这与不可变的字符串无关。

更好首选模式将是

 Dim f_sName as string = "Foo"

但是如果可以使用它,则取决于具体情况。

与Nothing或Empty初始化相同。如果你想尽早发现错误,那么:

  1. 只是根本没有初始化。 “变量'xxx'在被分配值之前使用”是你的朋友,而不是你的敌人。
  2. 无任何初始化。它也可能会带来错误。
  3. 使用Empty初始化(或只是“”,没有区别)。
  4. 关于像NetworkStream这样的类,同样的事情:不要创建实例,也不要在需要之前声明变量。对于像NetworkStream这样的Disposable类,这意味着使用Using子句:

     Using fs As New NetworkStream(....)
    
     End Using
    

    在狭窄范围之外提供“fs”既不可取也不有用。

答案 1 :(得分:1)

将字符串初始化为null和String.Empty几乎是一回事。就个人而言,我认为将其设置为string.empty确实是处理它的最佳方式。将其设置为null将导致抛出空引用异常,但将其设置为String.Empty则不会。

人们可以争论以两种方式初始化它的优点,但优化方面没有明显的区别。

答案 2 :(得分:1)

Dim f_sName as String = Nothing

Dim f_sName As New String()

顺便说一句:混合mixedCase变量命名与underscores(如在f_sName中)在大多数情况下看起来很奇怪,这个变量名称代表什么?