Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.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中创建引用成员变量,就像在C+中一样+;_C#_Windows_Pointers_Visual Studio 2015_Reference - Fatal编程技术网

C# 如何在C中创建引用成员变量,就像在C+中一样+;

C# 如何在C中创建引用成员变量,就像在C+中一样+;,c#,windows,pointers,visual-studio-2015,reference,C#,Windows,Pointers,Visual Studio 2015,Reference,对不起,这是一个基本问题,我找不到答案 我必须用C#编写一些代码,并且我需要创建一个类成员变量作为引用 在C++中,这个代码是 public class MyClass { MyClass(int& m_var): mVar(m_var){} int& mVar; } 然而,在C语言中,我似乎无法做到这一点# 我可以使用 MyClass(ref int m_var) 但我无法使用创建引用成员变量 class MyClass { MyClass(r

对不起,这是一个基本问题,我找不到答案

我必须用C#编写一些代码,并且我需要创建一个类成员变量作为引用

在C++中,这个代码是

public class MyClass
{
     MyClass(int& m_var): mVar(m_var){}
     int& mVar;
}
然而,在C语言中,我似乎无法做到这一点#

我可以使用

MyClass(ref int m_var)
但我无法使用创建引用成员变量

class MyClass
{
     MyClass(ref int m_var)
     {
          mVar = m_var;
     }
     ref int mVar;
}
因为这一行:

     ref int mVar;
告诉我错误:
类、结构或接口成员声明中的“无效令牌”ref。

为什么会这样?为什么C#取消了创建引用成员变量的功能


int只是另一个类的占位符

int
不仅仅是“另一个类”
int
是一种值类型。不能有一个引用它的字段。您可以有一个
ref
参数。在C#7中,可以有
ref
返回和局部变量,但仍然不能有字段

在CLR中,
int
与我们在这里讨论的领域中的类有很大的不同
x
是我们形象地称之为“堆栈”的整数,因为我不想查看它们是如何实际实现的。在C中,我似乎记得将其描述为堆栈变量:

int x = 0;
List
是一个类
y
,这里是一个“堆栈变量”,它是对“堆”上对象的可重新绑定引用:

为什么C#取消了创建引用成员变量的功能

他们没有“把它拿走”;他们没有绑架婴儿C++编译器并切断它的脚趾。他们只是觉得在C#中这样做不是个好主意,他们是对的。C#不是C,也不应该是C。丹尼斯·里奇设计C是为了像肯·汤普森这样的人使用;Anders Hejlsberg明确地设计了C#供我们其他人使用,他们更容易困惑

:

但是,CLR类型系统不允许字段作为其他变量的别名

(这是一篇老文章;C#7现在确实支持CLR一直支持的
ref
的附加用法)

新的C#程序员在
ref
和引用类型方面已经有足够多的麻烦了。就在最近,我在一个问题中看到了如下代码:

public void F(ref List<int> x) { ... }
public void F(参考列表x){…}

编写代码的人只想传入一个
列表
,而不需要创建昂贵的副本

奥安说了些什么。如果是
int
,请查看类似于此的问题
int
是一种值类型。在C#7中,可以有
ref
返回和局部变量,但仍然不能有字段。方法是编写一个带有
int
属性的简单类,并共享对该类实例的引用。int只是另一个类的占位符,我不想用模板将其复杂化。因此,您的意思是,如果我为
int mVar
分配另一个引用,它会自动成为引用成员变量?@Ðаn您是对的。该功能没有被删除。它还在那里。您只需声明您打算通过使用
safe
code向自己的脚开枪。然后你可以使用像C++一样的指针(记住C++的代码>和/代码>引用类型只是伪装的指针)。C#7添加了
ref
局部变量,但它有严格的规则来确保运行时的安全性,包括这些变量必须是局部变量,允许编译器分析其使用情况以确保安全(即确保变量不会比它所指的东西更长寿)。
public class C {
    //  x is passed by value. It is the value of a reference. Seriously, it is. 
    public C(List<String> x) {
        List = x;
    }
    public List<String> List { get; set; }
}
var list = new List<String>();
var x = new C(list);
var y = new C(list);
public class Reference<T> where T : struct
{
    public Reference(T t) {
        Value = t;
    }

    public T Value { get; set; }
}

class MyClass
{
     MyClass(Reference<int> ref)
     {
          _ref = ref;
     }
     Reference<int> _ref;
}
public void F(ref List<int> x) { ... }