我自己编了个例子,关于struct:
public struct structTest
{
public object abc;
public structTest(int a)
{ abc = new object();}
}
在别的类中使用:
structTest kk1 = new structTest(3);
kk1.abc = "a";
structTest kk2 = kk1;
kk1.abc = "b";kk2.abc我测出来是"a"。是不是kk1没有简单地赋abc的reference给kk2?我想问在这个abc的reference和reference指的object都放在stack内存里,还是object在heap内存上。是不是只要是struct类型,不管里面放的是什么,struct里的所有东西都在stack内存里。
关于string:
string是reference类型,在class中它指的内容是在heap上吗,如string aa = "wer";"wer"是不是在heap上,string在struct中呢?。关于static:
class A
{
private static string kk1 = "a";
public static string kk2 = "b";
}
在别的类内使用:
private A test = new A();
private someFunc()
{
test = null;
}
当test为null时,是不是static string kk1 和static string kk2的值还在内存里,那这样某些类里有static 变量,这些类的对象用完后,static变量岂不还残留着?感谢大家帮我解感:)
public struct structTest
{
public object abc;
public structTest(int a)
{ abc = new object();}
}
在别的类中使用:
structTest kk1 = new structTest(3);
kk1.abc = "a";
structTest kk2 = kk1;
kk1.abc = "b";kk2.abc我测出来是"a"。是不是kk1没有简单地赋abc的reference给kk2?我想问在这个abc的reference和reference指的object都放在stack内存里,还是object在heap内存上。是不是只要是struct类型,不管里面放的是什么,struct里的所有东西都在stack内存里。
关于string:
string是reference类型,在class中它指的内容是在heap上吗,如string aa = "wer";"wer"是不是在heap上,string在struct中呢?。关于static:
class A
{
private static string kk1 = "a";
public static string kk2 = "b";
}
在别的类内使用:
private A test = new A();
private someFunc()
{
test = null;
}
当test为null时,是不是static string kk1 和static string kk2的值还在内存里,那这样某些类里有static 变量,这些类的对象用完后,static变量岂不还残留着?感谢大家帮我解感:)
这个地方复制了内存,而不是复制引用,所以完全独立
struct总是在线程堆栈中// 如string aa = "wer";"wer"是不是在heap上,string在struct中呢?
string是class不是struct,总是在堆上// 这些类的对象用完后,static变量岂不还残留着
当然,静态变量类似于全局变量,和OO基本没有关系
“string是class不是struct,总是在堆上”,那在struct中的string也在堆(heap)上?
struct里只有一个引用,而数据还在堆上// 那在struct中的string也在堆(heap)上?
是的
kk1.abc = "a";
structTest kk2 = kk1; //拷贝, kk2.abc 和kk1.abc指向同一个对象,两个指针指向同一块内存
kk1.abc = "b"; //“b”是另一个对象(在堆上),把这个对象的地址赋给kk1.abc
这时kk1.abc 和 kk2.abc 指向不同的对象“b” “a”
c#中的VALUE类型有以下几种:
简单类型 (如int, float, char...);
struct, enum
Referece 类型有:delegate[代理],class, array, interface。
至于在一个struct中定义string, 也就是在一个值类型中存储了相应引用类型的reference.
也就是在堆栈中存贮了指向heap中某块内存的地址。
希望对你有所帮助,另外如果是刚开始学的话,你可以看这本书《C#完全手册》
包括Boolean、Byte、SByte、Int16、UInt16、Int32、UInt32、Int64、UInt64、Char、Double 和 Single
注意没有Decimal好像不用"简单类型"这个词
别的都对
public struct TestStruct
{
public int TheKK = 232;
}
struct规定不能这样初始化,而且它的默认constructor要给每个field赋null或0。初始化fields只能放在带参数的constructor里,有人知道为什么要有这样的规定吗?
还有如果我在某个类中private someStructType kk = new someStructType(...);如果kk很大,有什么办法让kk清空吗?(也许不行,因为是Value type,reference可以= null)
谢谢!