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++编写,并且没有考虑到类总是引用。