Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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#_.net - Fatal编程技术网

C#-值类型的引用包装器

C#-值类型的引用包装器,c#,.net,C#,.net,我想使用c#点类型作为引用类型(它是一个结构)。我想有一个类CPoint,它将包含一个点成员。是否有任何方法提升点的成员以充当Cpoint的成员。我试图避免 cpoint.point.X; cpoint.point.Y; 我想做什么 cpoint.X; cpoint.Y; 以及保持所有转换、运算符、为空等。 这很容易做到吗?我认为唯一的方法是重新写入并传递所有属性、运算符和方法,如下所示: public class PointReference { private Point point

我想使用c#
类型作为引用类型(它是一个结构)。我想有一个类
CPoint
,它将包含一个
成员。是否有任何方法提升
点的成员
以充当
Cpoint的成员
。我试图避免

cpoint.point.X;
cpoint.point.Y;
我想做什么

cpoint.X;
cpoint.Y;
以及保持所有转换、运算符、
为空
等。

这很容易做到吗?

我认为唯一的方法是重新写入并传递所有属性、运算符和方法,如下所示:

public class PointReference {
  private Point point;

  public int X { get { return point.X; } set { point.X = value; } }
}
(更改类名是有意的;
CPoint
不是很有表现力。)

像这样吗

public class CPoint {
  private Point _point = new Point(0,0);
  public double X { get { return _point.X; } set { _point.X = value; } }
  public double Y { get { return _point.Y; } set { _point.Y = value; } }
  public CPoint() { }
  public CPoint(Point p) { _point = p; }
  public static implicit operator CPoint(Point p) { return new CPoint(p); }
  public static implicit operator Point(CPoint cp) { return cp._point; } 
}

编辑:如果要将其自动转换为点/点,请按照上面的说明实现隐式转换。注意,我还没有测试这些,但它们应该可以工作。此处的更多信息:

如果需要它充当引用类型,请使用关键字。它将允许您通过引用进行传递。有了这一点,您将从它作为一个结构中获得所有的性能优势,并明确知道何时您希望它像一个引用一样工作。还可以使用关键字通过引用返回参数

如果您需要它能够表示null,那么使用

如果您只是想访问类似于
foo.MyPoint.X
的内容,请将其声明为如下字段:

class Foo {
  public Point MyPoint;
}

为什么你想/需要这样的包装器?@ XTIM0,就像我说的,把它当作一个引用类型。@巴伦奇:在这样做之前,考虑一下为什么有一类简单的类型定义为“代码>结构> <代码>。其中之一是,
struct
的分配速度非常快,绘图方法中使用的
Point
struct的分配和释放速度非常关键。@Tigran确实如此。然而,我不是在用这个来画画。我将它(以及大小)用作类的属性,而不是用于绘图。我想能够做
MyClass.Pos.X=10
和类似的事情。@barunch:所以如果你只需要一个
占位符
创建一个简单的类,而不是包装器。如果需要的话,为了方便转换,
到/从
点结构,还可以定义隐式强制转换运算符。是的,除了对每个运算符和转换执行此操作会非常烦人之外……请查看添加的隐式转换确实,不要使用
,而是完全由您自己实现。请省去setter。可变的
引用类型太令人毛骨悚然了。@CodeInChanos:可变结构太令人毛骨悚然了(在我看来,在大多数情况下,它的设计都很糟糕)。相反,可变引用类型是可以的。示例可能是您的位置或鼠标位置。@CodesInChaos-如果它不可更改,则将其作为引用类型是毫无意义的。为值类型创建引用包装器的主要(唯一?)原因是,您可以传递一个可以修改其内容的标识(所有其他引用都会收到更改的值)。我从c#首次创建以来就一直在用它编程,从来都不知道您可以这样做(将“ref”与值类型一起使用)!但是,这有其局限性:无法将该“引用”存储为集合的元素。