如何解决C#中使用的getter和setter是什么?如何将它们与数组一起使用?
| 1)我对编程还是很陌生,并且已经阅读了一些有关getter和setter的知识。但是我真的不明白为什么要使用它们。有人可以解释一下,还是可以给我写一篇文章? (我读的那些书对我来说不是很容易理解...) 2)在我当前的项目中,我有一个类,在其中声明和初始化一个结构数组。现在,我需要从另一个类访问该数组,但这会给我错误:An object reference is required to access non-static member \'BaseCharacter.Attributes\'
。
我认为这可能意味着我需要使用getter和setter?但是,这对数组如何起作用?
提前致谢!
西蒙
编辑:第二个问题解决了,这给我带来了其他问题。当我想在另一个类中使用某个类时,我正在创建该类的新实例,对吗?这意味着我得到了原始值?
但这不是我想要的。
第二类用于生成UI,并且需要我在第一类中保留的值。
在某些时候,我将实现保存文件(XML,甚至在稍后的服务器上)。然后可以从这些文件中获取值吗?
解决方法
对于getter和setter(使用它们的东西称为Properties),它只是使人们认为他们正在使用变量的便捷且美观的方法,但是只要变量被更新或访问。例如:
BankAccount.Interest
看起来比
BankAccount.GetInterest()
即使在两种情况下都可以在请求时计算利息。
它们还用于使变量可以从类外部访问,但只能使用以下技术在类内部进行更改:
public double Interest {
get;
private set;
}
例如,如果您曾经使用Windows窗体并更新了控件的Height
或Width
属性,则使用的是setter。看起来您正在使用普通的实例变量,例如c.Height = 400
,但实际上是让c
通过在新位置重画来更新其位置。因此,设置器会在变量更改时准确通知您,以便您的类可以根据新值更新其他内容。
属性的另一个应用是您可以检查人们尝试将属性设置为的值。例如,如果您想为每个银行帐户维持一个利率,但又不想允许负数或超过50的数字,则只需使用setter:
private int _interestRate = someDefault;
public int InterestRate {
get { return _interestRate; }
set {
if (value < 0 || value > 50)
throw new SomeException(); // or just don\'t update _interestRate
_interestRate = value;
}
}
这样,人们就无法将公共值设置为无效值。
对于第二个问题,您可以根据要执行的操作执行以下两项操作之一。
一:您可以使该成员成为static
。这意味着整个类中仅存在一个,而不是每个类实例一个。然后,您可以通过ClassName.MemberName
访问它。
您可以这样进行:
// inside the BaseCharacter class definition:
public static SomeStruct[] Attributes = new SomeStruct[size];
// then to use it somewhere else in your code,do something with
BaseCharacter.Attributes[index]
二:您必须创建该类的实例,然后通过该类访问数组。这意味着每个对象将具有其自己的单独数组。
您可以这样做:
BaseCharacter bc = new BaseCharacter();
// use bc.Attributes
第二个可能是您想要做的,因为您可能想要与其他所有字符分开修改每个字符的属性。
,实际上,您提到的错误与getter和setters概念无关,这是因为在创建类之后,需要在使用对象之前创建对象。将类视为文档的模板,将对象视为文档
您最有可能这样做:
var someVar = BaseCharacter.Attributes;
当您应该执行以下操作时:
var someVar = new BaseCharacter();
var someOtherVar = someVar.Attributes;
关于吸气器和吸气器的原因,塞思·卡内基的答案很好地介绍了它。
,如果您不熟悉面向对象编程,则可能会错过一个重要的概念,那就是封装。
类的字段(属性)只能从该类(或其继承的类)内部访问。也就是说,如果我们有一个班级人员,只需一个名字,您就可以
public class Person
{
public string Name;
}
因此,您可以在程序中的任何位置执行以下操作来访问它:
Person person = new Person();
person.Name = \"Andre\";
可以,但是没有封装。在某些语言(例如C ++或Java)中,是这样完成的:
public class Person
{
private string _name;
public string setName(string newName)
{
this._name = newName;
}
public string getName()
{
return this._name;
}
}
Person person = new Person();
person.setName(\"Andre\");
这使我们的_name属性被封装,只能通过其get和set方法(即,通过类的接口)进行检索。
C#使此过程更容易,允许使用getter和setter:
public class Person
{
private string name;
public string Name
{
get { return this.name; }
set { this.name = value; }
}
}
Person person = new Person();
person.Name = \"Andre\";
这非常类似于第二个示例(Java / C ++方式),但是您将Name作为属性而不是方法,并将我们的name属性封装起来
,1)它们似乎是可选的,但它们使您可以更好地控制代码:
您可以拦截新值并避免设置新值(例如,排除无意义的值)。此外,还可以在属性更改或更新时触发自定义事件(就像WinForms控件一样)。
private string name;
public string Name
{
get
{
// running additional code,e.g. here I avoid returning \'null\' for a name not set
if(name == null)
return \"(Unknown)\";
return name;
}
set
{
// checking incoming values,e.g. here I avoid setting an empty name
name = value != null && value.Length > 0 ? name : null;
// running more/additional code,e.g. here I raise an event
if(OnNameChange)
OnNameChange();
}
}
2)在不知道代码的情况下,很难告诉您确切的原因,但是,如果您想访问某些成员变量或属性,则必须创建该类的对象或将变量设为静态(例如,共享在对象的所有实例之间):
class MyClass
{
public static int someNumber = 55;
public int thisNumber;
}
// ...
int someothervar = MyClass.someNumber; // access the static member variable
MyClass mc = new MyClass(); // create an object of the class
int yetanothervar = mc.thisNumber; // access the member variable
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。