代码之家  ›  专栏  ›  技术社区  ›  Sasha

字符串泛型约束的值类型部分

c#
  •  1
  • Sasha  · 技术社区  · 15 年前

    如果字符串是一个值类型,我假设它是,那么为什么下面的声明是合法的:

    struct Refsample<T> where T : class
    
    RefSameple<string>; //why is it legal?
    

    摘自C深度,第75页

    4 回复  |  直到 15 年前
        1
  •  2
  •   Evgeny    15 年前

    字符串是不可变的引用类型。

    你想说吗?

    struct Refsample<T> where T : class
    

    结构本身是值类型,但它可以包含引用类型。

    值类型变量存储在内存堆栈中,但引用类型变量的内存地址指向堆。

    例如

    struct Refsample<T> where T : class
    {
       // stored in the stack as well.
       public int Age; 
    
       // memory address pointing to the heap stored in the stack, 
       // but the actual object is stored in the heap.
       public string Name;
       // same as string above if T was reference type;
       // otherwise, if value type, same as Age above.
       public T SomeThing; 
    }
    
        2
  •  2
  •   baretta    15 年前

    string是一个引用类型,尽管它具有值类型的一些特性。

        3
  •  1
  •   Charles Graham    15 年前

    字符串实际上是一个引用类型, 行为 像值类型。这就是为什么你可以测试一个字符串的空值,而不能测试int、bool等。好吧,你可以,但是你只会得到默认值0、false等。

        4
  •  1
  •   JaredPar    15 年前

    字符串是引用类型而不是值类型。