C#引用类型

来源:互联网 发布:js面向对象的面试题 编辑:程序博客网 时间:2024/04/29 12:39

1、静态内存和动态内存分别对应栈内存和堆内存吗?那么值类型和引用类型的内存分配是怎样的?

在C++和C#中有一个一致的地方,就是对象要么分配在线程栈上,要么分配在进程堆上。栈内存就是事先声明的静态分配的内存。(编译期完成)

堆内存就是代码运行时动态分配的内存。(运行期完成)。

无论哪一种.NET语言,值类型和引用类型的概念都是最基本的概念。在C#中,每一种类型要么是值类型,要么是引用类型。值类型一般都是在线程栈

上静态分配内存。引用类型的对象总是在进程堆中动态分配内存。对于值类型,如果某个类的实例有个值类型的字段,例如类的成员变量是值类型的,但是类

是引用类型的,那么这个成员变量也会存储在堆中。

2、new可以用于静态分配内存吗?

C++和C#对于对象分配问题,仍然分为静态分配和动态分配。在C++中需要程序员自己去考虑分配问题。也就是什么时候需要new,什么时候只是声明一个

引用类型即可。在C#中,new操作符不但用于对象的动态分配,还可以用于静态分配。此时,作为C++程序员,会十分迷惑。new到底是怎么分配静态内存的呢?


    struct TempStruct    {        public int m_n;        public TempStruct(int n)        {            m_n = n;        }    }    class TempClass    {        public int m_n;        public TempClass(int n)        {            m_n = n;        }    }    class Program    {        static void Main()        {            TempStruct t1 = new TempStruct(5);            TempStruct t2 = t1;            t2.m_n = 10;            global::System.Console.WriteLine(t1.m_n);            global::System.Console.WriteLine(t2.m_n);            TempClass c1 = new TempClass(9);            TempClass c2 = c1;            c2.m_n = 18;            global::System.Console.WriteLine(c1.m_n);            global::System.Console.WriteLine(c2.m_n);            global::System.Console.ReadLine();        }    }}


在程序中,可见TempStruct就是静态类型。而new操作符也可以分配值类型的实例,但这种情况下new操作符仅起到向成员函数传递参数的作用。

与C++不同,C#的静态分配必须用new操作符而不能直接向构造函数传递参数。在C++中,

TempStruct t1(5);

是可以的。但在C#中必须写成 TempStruct 他 = new TempStruct(5);


在此强调一下,C#的值类型包括 基本类型(int,double,float……等)struct类型,enum类型;

而引用类型包括class和delegate类型;

C++的引用请见我之前的blog:http://blog.csdn.net/mydad353193052/article/details/46602241

其他C++与C#的不同点:

C++ > C# 的引用: "c1"
1、C#中的引用是一个介于C++引用和指针之间的概念。C#的引用也是到一个对象的引用,所有该对象可访问的公有成员都通过 "." 运算符来访问。
2、不像C++的引用而像C++指针的一个特点是引用可以为空。
MyClass c2 = NULL;
3、类似C++指针的另一个特点是C#引用是可以修改的。给定的引用,可以改而指向另一个同类型的对象。
4、像C++引用而不像C++指针的一个特点是C#的引用无法用来访问对象的物理空间(即对象的内存地址)。
5、C#所有的类都是引用类型,所有的引用类型都是类或者接口。所有的类都是从System.Object类继承的。引用类型的对象总是存储在heap中。
6、C#的char类型均为二字节而且用UNICODE标准来编码。在C++中char通常可能是一字节而且是ASCII编码格式。
7、C#中没有unsigned关键字,现在用byte、ushort、uint和ulong来表示无符号整型。在C#中long 和 ulong的大小都是8字节。
8、public static [相应的基本类型] Parse(string s)。静态方法能够解析一个字符串,例如:
bool i = true;
i = System.Boolean.Parse("false");
int j = System.Int32.Parse("-55");

9、public string ToString() 该方法将数值写成一个字符串。这个方法是Object类中ToString()方法的覆写版本。


0 0
原创粉丝点击