Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对象创建差异_C# - Fatal编程技术网

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