C# 对象创建差异
两种说法的区别是什么C# 对象创建差异,c#,C#,两种说法的区别是什么 int main() { A a = new A(); A a; } 请解释这两个对象创建语句。A A=newa() 这将创建类型为a的新对象。a的值将是a的新实例 A 这只会将a声明为a的一种类型。a的值将为nulla=newa() 这将创建类型为a的新对象。a的值将是a的新实例 A 这只会将a声明为a的一种类型。a的值将为null第一个命令在堆栈上分配一个变量(a),并在堆上初始化(newa()) 第二个只在堆栈上分配变量。它没有初始化,因此在通过
int main()
{
A a = new A();
A a;
}
请解释这两个对象创建语句。A A=newa()代码>
这将创建类型为a
的新对象。a
的值将是a
的新实例
A代码>
这只会将a声明为a
的一种类型。a
的值将为null
a=newa()代码>
这将创建类型为a
的新对象。a
的值将是a
的新实例
A代码>
这只会将a声明为a
的一种类型。a
的值将为null
第一个命令在堆栈上分配一个变量(a
),并在堆上初始化(newa()
)
第二个只在堆栈上分配变量。它没有初始化,因此在通过函数返回值或调用类构造函数进行赋值之前无法使用
旁注:当您的程序被编译并运行时,它甚至与您编写的代码根本不相似。变量在您需要它们之前就被加载了。上面的代码大致如下所示:
如果您不完全理解这些命令中的每一个是什么,这没关系,但是我已经对其进行了注释,试图尽可能直接地进行解释。因为我们从不给任何东西分配A
,所以它只是在本地堆栈上挂起,什么也不做。我们不能使用它,因为它没有指向任何对象
代码中有许多不同的原因,您可能会看到声明与实际赋值分离
例如,有时需要在try{}catch{}
子句之外声明一个变量。假设您的类在其构造函数中接受一个值。你有一个从数据库中获取数据的函数。但是,由于它是一个DB调用,因此您希望捕获异常,如果抛出异常,则使用默认值初始化该类,而不是使用DB调用返回的值
由于C#中作用域的工作方式,在try{}catch{}
中声明的变量在其外部是不可访问的,因此您需要在初始化变量之前在代码中声明该变量。第一个命令在堆栈上分配一个变量(a
),并在堆上初始化(newa()
)
第二个只在堆栈上分配变量。它没有初始化,因此在通过函数返回值或调用类构造函数进行赋值之前无法使用
旁注:当您的程序被编译并运行时,它甚至与您编写的代码根本不相似。变量在您需要它们之前就被加载了。上面的代码大致如下所示:
如果您不完全理解这些命令中的每一个是什么,这没关系,但是我已经对其进行了注释,试图尽可能直接地进行解释。因为我们从不给任何东西分配A
,所以它只是在本地堆栈上挂起,什么也不做。我们不能使用它,因为它没有指向任何对象
代码中有许多不同的原因,您可能会看到声明与实际赋值分离
例如,有时需要在try{}catch{}
子句之外声明一个变量。假设您的类在其构造函数中接受一个值。你有一个从数据库中获取数据的函数。但是,由于它是一个DB调用,因此您希望捕获异常,如果抛出异常,则使用默认值初始化该类,而不是使用DB调用返回的值
由于作用域在C#中的工作方式,在try{}catch{}
中声明的变量在其外部无法访问,因此您需要在初始化变量之前在代码中声明该变量。第一个变量创建一个新的insatnce并将其分配给变量a
第二个不创建任何实例,因此a
为null
第一个创建一个新的insatnce并将其分配给变量a
第二条语句不创建任何实例,因此a
是null
在第一条语句中,它将创建一个类的新对象实例,并将其分配给一个变量
在第二条语句中,它只创建一个引用。在第一条语句中,它将创建一个类的新对象实例,并将其分配给一个变量
在第二条语句中,它只创建了一个引用。只有第一条语句实际创建了一个新对象。其他人提到的第二条语句只是在堆栈上分配了一个a类型的变量
第一个语句在管理堆上创建一个新对象,将其上的引用存储在堆栈上创建的a
类型的变量上。只有第一个语句实际创建了一个新对象。其他语句提到的第二个语句只是在堆栈上分配一个类型为a的变量
第一个在管理堆上创建一个新对象,并将其上的引用存储在堆栈上创建的a
类型的变量上。您的语句:第二个只在堆栈上分配变量。它没有初始化,因此在通过函数返回值或调用类构造函数进行赋值之前无法使用;如果func不返回任何东西,那么是否可以使用它?否。如果声明变量a
;则除了为其赋值外,不能以任何方式使用它。a.func()
将创建一个编译器错误,告诉您该变量未初始化。您需要执行a a=new a()
o
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 8 (0x8)
.maxstack 1
.locals init ([0] class DERP.Program/A a, // This code here declares a local
// variable: A a;
[1] class DERP.Program/A b) // another local variable: A b;
nop
newobj instance void DERP.Program/A::.ctor() // This is: new A()
stloc.1 // this loads the new A() we created
// into A b; (stloc.1 means to store
// the last item we created into the
// local variable at index [1]
ret
} // end of method Program::Main