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

C# 获取/设置C类中结构或类的成员#

C# 获取/设置C类中结构或类的成员#,c#,class,struct,C#,Class,Struct,如果我有一个结构或一个类,假设我在使用一个向量2(它有两个成员,float X和float Y),我应该如何在类中正确地获取/设置它的方法 这是我现在知道的代码: public class MyClass { private Vector2 vector; //Has to be private public Vector2 Vector { get { return vector; } set { vector = value; }

如果我有一个
结构
或一个
,假设我在使用一个向量2(它有两个成员,
float X
float Y
),我应该如何在类中正确地获取/设置它的方法

这是我现在知道的代码:

public class MyClass
{
    private Vector2 vector; //Has to be private
    public Vector2 Vector
    {
        get { return vector; }
        set { vector = value; }
    }
}
但是如果我想用
set
方法编辑
Vector2
的成员(或某些成员),该怎么办?这就是我想要的:

set.X
{
    vector.X = value.X;
}
set.Y
{
    vector.Y = value.Y;
}

它可以简单地称为
Vector.X=5
。我想出了另一种选择,使用类似于
public float VectorX{set{vector.X=value;}}
的方法,但我更喜欢逻辑性更强、面向对象的方法。有吗?

您不能指定子方法来处理该部分集合,因为该集合由
Vector
类处理,因此我们不在您的范围之内。当有人调用
Myobject.Vector
时,他们正在调用您的get函数,但当它转到
.X
时,他们正在调用
Vector.get\X
函数

通过使用该工具查看编译后的代码,可以更容易地看到这一点,它揭示了您的属性所使用的实际方法调用

现在,您可以做的是包装某些属性,如前所述。结果是这样的

public class MyClass
{
    private Vector2 _vector; //Has to be private
    public Vector2 Vector
    {
        get { return vector; }
        set { vector = value; }
    }

    public float VectorX
    {
        get { return _vector.X; }
        set { _vector.X = value; }
    }

    public float VectorY
    {
        get { return _vector.Y; }
        set { _vector.Y = value; }
    }
}
另一种选择可能是在Vector类中使用的模式,在MyClass可以侦听和响应的每个更改中引发一个事件,从而在更新子元素时应用逻辑

还可以选择使用索引器属性

public class MyClass
{
    public enum Axis { X, Y }

    private Vector2 _vector; //Has to be private
    public Vector2 Vector
    {
        get { return vector; }
        set { vector = value; }
    }

    public float this[Axis axis]
    {
        get { return axis == Axis.X ? vector.x : vector.y; }
        set
        {
            if(axis == Axis.Y)
            {
                // Special logic here
                vector.Y = value;
            }

            if(axis == Axis.X)
            {
                // Special logic here
                vector.X = value;
            }
        }
    }
}

因为Vector2是一个结构,所以您将获得一个副本。您需要使用setter来设置新的向量2。有两种方法:

Vector2 v = myClass.Vector; //get a copy of the vector
v.X = 5f; // change its value
myClass.Vector = v; // put it back
我真的不喜欢下面的说法,但这是一种说法:

    myClass.Vector = new Vector2(2f, myClass.Vector.Y)
在MyClass中,可以创建仅设置X值的属性:

public float X {
    get { return Vector.X; }
    set {
        Vector2 v = Vector;
        v.X = value;
        Vector = v;
    }
}

(Vector可以是一个自动属性)

无论
Vector2
是一个类还是一个结构,它都有很大的区别

由于
Vector2
是一个类,您只需

obj.Vector.X = 5;
拥有

public class MyClass
{
    private Vector2 _vector; //Has to be private
    public Vector2 Vector
    {
        get { return vector; }
        set { vector = value; }
    }
}

但是,如果
Vector2
是一个结构,则无法修改
get
中的返回值。如果您尝试,将出现编译错误:

无法修改…的返回值。。。因为它不是一个变量

您可以使用建议的方法解决此问题

public float VectorX
{
    get { return _vector.X; }
    set { _vector.X = value; }
}

public float VectorY
{
    get { return _vector.Y; }
    set { _vector.Y = value; }
}
或者您可以围绕
Vector2
提供一个包装类,如:

class Vector2Wrapper
{
    public Vector2 Vector;
}
然后将
Vector2Wrapper
存储在
MyClass

public class MyClass
{
    private Vector2Wrapper _vector2Wrapper;
    public Vector2Wrapper VectorWrapper
    {
        get { return _vector2Wrapper; }
        set { _vector2Wrapper= value; }
    }
}
然后你可以像这样修改它

obj.VectorWrapper.Vector.X = 5;

obj.Vector.X=5有什么问题?你的替代方案怎么不是面向对象的?你这是什么意思?如果
Vector2
是一个
struct
,请重新思考这个问题。我的意思是什么“非面向对象”是指它不使用该方法访问其成员,我更喜欢
Vector.X
而不是
VectorX
。另外,我必须为每个成员编写一个新的
get
set
。@TimS。Vector2是XNA框架的一个类。这是一篇非常有趣的文章,我期待着阅读。我希望不是这样,我缺少一些基本的语法。。。很高兴我能帮上忙,即使这不是你想要的答案。我希望我的一个备选方案能有所帮助,我还有一个方案需要补充我的答案…谢谢,我也知道这个备选方案,但我希望能在每个成员上使用相同的setter。你可以在MyClass中创建一个属性,设置你喜欢的任何值。谢谢,这完全消除了我的任何困惑——我习惯于用C++编写,并且没有考虑到类总是引用。