String是一种引用类型,即使它具有值类型的大多数特性,例如是不可变的并且具有==重载以比较文本而不是确保它们引用相同的对象.
为什么字符串不是一个值类型呢?
有点奇怪的问题,但我想知道有人可以帮忙......
在C++中,我可以做这样的事情
class MyOtherClass
{
private:
MyLogger* logger;
public:
MyOtherClass (MyLogger* logger)
: logger (logger)
{}
};
class MyClass
{
private:
MyLogger* logger;
public:
MyClass (MyLogger* logger)
: logger (logger)
{}
};
int main (int c, char** args)
{
MyLogger* logger = new MyLogger ();
/* Code to set up logger */
MyOtherClass* myOtherClass = new MyOtherClass (logger);
MyClass* myClass = new MyClass (logger);
}
Run Code Online (Sandbox Code Playgroud)
因此,每个其他对象(myOtherClass和myClass)都将包含一个指向logger的指针,因此它们将调用相同的logger类.但是,我如何在C#中实现同样的目标?有没有办法存储一个引用或指向全局对象的指针 - 我猜测在C#中我是否有类似的东西
public class MyClass
{
private MyLogger logger = null;
public MyClass (MyLogger …Run Code Online (Sandbox Code Playgroud) 我理解String是一个对象,而不是Int,除非你创建对象,否则对象变量通常不指向任何东西.所以我知道它是如何工作的.
但是,就简单实用的编程而言,为什么.NET不将字符串初始化为空(""),因为这肯定是字符串变量的最常见用法 - 作为字符串,而不是作为对象?
我从来没有(还)需要一个字符串为null,即"不是字符串".这似乎是一种罕见的要求.我不能说int变量是null,那么为什么用string呢?毫无疑问,将它作为一个选项是必要的,但是为什么.NET开始时为null,当int等给出正确的初始值时?
我问,因为我不仅想了解某些事情是如何运作的,而是为什么,因为它减少了我对它看起来多么奇怪的咆哮的渴望.:)
我总是想知道什么时候涉及到可变性。为什么 .net 设计者只开发了 stringbuilder 类来实现 string 类的可变性,而不是 intbuilder for int 考虑到 int 和 string 的实现方式完全相同,而不管它们的数据类型如何。
注意:这是一个假设的讨论.我实际上并不想实现struct String.
.Net String类可以是值类型(结构),因为它是不可变的并且具有很少的成员.但String不是值类型.可能是因为String是在引入可空类型之前设计的,或者可能是为了匹配Java字符串的行为.
将String更改为值类型或实现String的值类型变体是否有益?它将删除一个间接级别并匹配常见的非可空案例.