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