C# 如何使用在堆栈中创建的类对象
我是c#的新手。所以我无法理解下面提到的概念C# 如何使用在堆栈中创建的类对象,c#,C#,我是c#的新手。所以我无法理解下面提到的概念 using System; namespace vivek { class viku { public void func1() { Console.WriteLine("Base"); } } class Behera { static void Main(String[] args) {
using System;
namespace vivek
{
class viku
{
public void func1()
{
Console.WriteLine("Base");
}
}
class Behera
{
static void Main(String[] args)
{
viku v;
v.func1();
}
}
}
编译后显示以下错误
error CS0165: Use of unassigned local variable 'v'
您需要实例化类的对象 改变 到
您需要实例化类的对象 改变 到 我不知道c#语法,但是。。我想可能是的 viku v=新的viku(); v、 func1() 我不知道c语法,但是。。我想可能是的 viku v=新的viku(); v、 func1()
要创建对象,需要调用构造函数
viku v = new viku();
甚至更短
var v = new viku();
您应该阅读有关构造函数的内容要创建对象,需要调用构造函数
viku v = new viku();
甚至更短
var v = new viku();
您应该阅读有关构造函数的内容您无法指示编译器在C#中的堆栈上创建对象-您现在在托管内存环境中工作,在托管内存环境中,事物的托管端具有决定对象创建位置的规则 堆栈上的结果纯粹是一个实现细节。通常,它将是您的引用变量和任何局部变量1,前提是这些变量和值类型没有因为而被提升,并且您没有使用or方法2编写代码 要创建任何对象(
class
声明引用类型,struct
或enum
声明值类型),必须使用new
1正如我所说,本地值类型有时会出现在堆栈上,这是一个实现细节。但是有一个长期存在的神话,“值类型在堆栈上,引用类型在堆中”。您不应该将
类
更改为结构
,而只是为了强制它进入堆栈(无论如何,它也不会总是这样)
2在所有这些情况下,编译器实际上会重新编写您编写的代码,事实上,看起来像是局部变量,编译器为保存它们而构造的新
类的字段。您无法指示编译器在C#中的堆栈上创建对象-您现在在托管内存环境中工作,其中托管端具有决定对象创建位置的规则
堆栈上的结果纯粹是一个实现细节。通常,它将是您的引用变量和任何局部变量1,前提是这些变量和值类型没有因为而被提升,并且您没有使用or方法2编写代码
要创建任何对象(class
声明引用类型,struct
或enum
声明值类型),必须使用new
1本地值类型有时会最终出现在堆栈上,正如我所说的,这是一个实现细节。但是有一个长期存在的神话,“值类型在堆栈上,引用类型在堆中”。您不应该将类
更改为结构
,而只是为了强制它进入堆栈(无论如何,它也不会总是这样)
2:在所有这些情况下,编译器实际上重新编写了你编写的代码,以及看起来像局部变量的代码,实际上,编译器编译了一个新的<>代码>类< /代码>的字段。
你似乎是C++的一个家伙,帮助你可视化(但它不是真的,只是一个类比)。把C++中的类看作C++中的指针折射。
如果我们把你的原始代码改写成C++中的“等价”(忽略内存泄漏,就像我说的只是一个基本的类比,而不是一个确切的事实),那就是:
namespace vivek
{
class viku
{
public:
void func1()
{
Console::WriteLine("Base");
}
}
class Behera
{
static void Main(String[] args)
{
viku* v;
v->func1();
}
}
}
现在(如果我正确地知道你知道C++),你为什么对<代码> V<代码>的调用不起作用,它没有指向任何代码的例子> VIKU/类。
< P>你似乎是C++的人,有一件事可以帮助你可视化(但它不是真的,只是一个比喻)把C++中的类看作C++中的指针折射。
如果我们把你的原始代码改写成C++中的“等价”(忽略内存泄漏,就像我说的只是一个基本的类比,而不是一个确切的事实),那就是:
namespace vivek
{
class viku
{
public:
void func1()
{
Console::WriteLine("Base");
}
}
class Behera
{
static void Main(String[] args)
{
viku* v;
v->func1();
}
}
}
现在(如果我正确地假设您了解C++),很明显为什么对v
的调用不起作用,它不会指向viku
类的任何实例;方法它不是一个像我们在C++中创建堆栈对象那样的对象吗?实际上,所有C#变量(除了int、double等值类型)都是引用,而不是对象。您必须创建引用的实例。这里没有基于堆栈的自动对象;方法它不是一个像我们在C++中创建堆栈对象那样的对象吗?实际上,所有C#变量(除了int、double等值类型)都是引用,而不是对象。您必须创建引用的实例。这里没有自动堆栈对象。在C++中,我们可以创建对象并调用上面提到的函数。在c#中有什么不同吗?我的问题是,在c#中,我们是否只能使用new创建对象?当您使用new
时,将调用对象的构造函数。它初始化对象状态并分配内存。此外,在C++中,不能使用C++中未赋值的变量,我们可以创建对象并调用上面提到的函数。在c#中有什么不同吗?我的问题是,在c#中,我们是否只能使用new创建对象?当您使用new
时,将调用对象的构造函数。它初始化对象状态并分配内存。同样,在C#中,不能使用未赋值变量。我不确定这是否正确。上面的程序(稍加修改,将控制台::WriteLine
替换为cout
等)在gcc中编译并运行!我猜想是因为C++没有1)在使用变量之前有一个编译器规则,2)在调用实例方法之前做一个“null”检查。code>func1
从不访问ins中的任何内存