getter和setter在C#中的作用是什么?如何将它们与数组一起使用

本文关键字:数组 一起 setter 是什么 作用 getter | 更新日期: 2023-09-27 17:57:36

1)我对编程还很陌生,读过一些关于getter和setter的文章。但我真的不明白为什么要用它们。。有人能解释一下吗,或者给我指一篇文章?(我读到的那些对我来说不是很容易理解…)

2) 在我当前的项目中,我有一个类,我在其中声明并初始化一个结构数组。我现在需要从另一个类访问数组,但它给出了错误:An object reference is required to access non-static member 'BaseCharacter.Attributes'

我想这可能意味着我需要使用getter和setter?但是这对数组是如何工作的呢?

提前感谢!

西蒙。

编辑:第二个问题解决了,这让我想到了另一个问题。当我想在另一个类中使用某个类时,我正在创建该类的新实例,对吗?这意味着我得到了原始值?但那不是我想要的。

第二个类用于生成UI,并且需要我保存在第一个类中的值。

在某个时刻,我将实现保存文件(XML,甚至在稍后阶段的服务器上)。然后我可以从这些文件中获取值吗?

getter和setter在C#中的作用是什么?如何将它们与数组一起使用

对于getter和setter(使用它们的东西被称为Properties)来说,这只是一种方便且美观的方式,可以让人们认为他们在使用变量,但无论何时更新或访问变量,都可以进行一些计算。例如:

BankAccount.Interest

看起来比好

BankAccount.GetInterest()

尽管在这两种情况下,您都可以在请求时计算利息。

它们还用于使变量能够从类外访问,但只能通过以下技术在类内更改:

public double Interest {
    get;
    private set;
}

对于正在使用的setter示例,如果您曾经使用过Windows窗体并更新了控件的HeightWidth属性,那么您正在使用setter。虽然看起来您使用的是像c.Height = 400这样的普通实例变量,但实际上是让c通过在新位置重新绘制来更新它的位置。因此,setter会在变量发生更改时准确地通知您,这样您的类就可以根据新值更新其他内容。

房地产的另一个应用是,你可以检查人们试图将房地产设置为的价值。例如,如果你想为每个银行账户保持利率,但不想允许负数或超过50的数字,你只需要使用一个设置器:

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]

Two:您必须创建一个类的实例,并通过该实例访问数组。这意味着每个对象都有自己独立的数组。

你可以这样做:

BaseCharacter bc = new BaseCharacter();
// use bc.Attributes

第二个可能是你想要做的,因为你可能想要将每个角色的属性与所有其他角色分开修改。

实际上,您提到的错误与getters和setters概念无关,这是因为在创建类之后,您需要在使用其成员之前创建一个对象;将类视为文档的模板,将对象视为文档

你很可能正在做这样的事情:

var someVar=BaseCharacter.Attributes;

当你应该做这样的事情:

var someVar=新的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