Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.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#中使用的getter和setter是什么?如何将它们与数组一起使用?_C#_Oop_Get_Set - Fatal编程技术网

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

C#中使用的getter和setter是什么?如何将它们与数组一起使用?,c#,oop,get,set,C#,Oop,Get,Set,1) 我还是一个编程新手,读过一些关于getter和setter的书。但是我真的不明白为什么要用它们。。谁能解释一下,或者给我指一篇文章吗?(我读的那些对我来说真的不容易理解…) 2) 在我当前的项目中,我有一个类,我在其中声明并初始化一个结构数组。我现在需要从另一个类访问数组,但它给了我一个错误:访问非静态成员'BaseCharacter.Attributes'需要对象引用 我想这可能意味着我需要使用getter和setter?但这对阵列是如何工作的呢 提前谢谢 西蒙 编辑:第二个问题解决了,

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

2) 在我当前的项目中,我有一个类,我在其中声明并初始化一个结构数组。我现在需要从另一个类访问数组,但它给了我一个错误:
访问非静态成员'BaseCharacter.Attributes'
需要对象引用

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

提前谢谢

西蒙

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

第二个类用于生成UI,需要保留在第一个类中的值


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

对于getter和setter(使用它们的东西称为属性),这只是一种方便、美观的方法,可以让人们认为他们在使用变量,但只要更新或访问变量,就要进行一些计算。例如:

BankAccount.Interest
看起来比

BankAccount.GetInterest()
即使在这两种情况下,您都可以在请求利息时计算利息

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

public double Interest {
    get;
    private set;
}
以正在使用的setter为例,如果您曾经使用Windows窗体并更新过控件的
Height
Width
属性,则您使用的是setter。虽然它看起来像是在使用一个普通的实例变量,比如
c.Height=400
,但实际上是让
c
通过在一个新位置重新绘制来更新它的位置。因此,setter会在变量发生更改时准确地通知您,以便您的类可以基于新值更新其他内容

属性的另一个应用是,您可以检查人们试图将属性设置为的值。例如,如果您希望为每个银行帐户保持利率,但不希望允许负数或超过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;
    }
}
Two:必须创建类的实例并通过该实例访问数组。这意味着每个对象都有自己的独立数组

你会这样做:

BaseCharacter bc = new BaseCharacter();
// use bc.Attributes
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");

第二个错误可能是您想要做的,因为您可能需要分别修改每个字符的属性,而不是所有其他字符。

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

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

BaseCharacter bc = new BaseCharacter();
// use bc.Attributes
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");
var someVar=BaseCharacter.Attributes

当你应该这样做的时候:

BaseCharacter bc = new BaseCharacter();
// use bc.Attributes
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");
var someVar=新的BaseCharacter(); var someOtherVar=someVar.Attributes

关于为什么getter和setter的答案很好地涵盖了这一点。

1)它们似乎是可选的,但它们允许您对代码进行更多的控制:

您可以截取新值并避免设置它们(例如,排除无意义的值)。此外,您还可以在属性更改或更新时触发自定义事件(就像WinForms控件一样)

2) 在不了解代码的情况下,很难告诉您确切的原因,但如果您想访问某个成员变量或属性,则必须创建该类的对象或使该变量成为静态变量(例如,在对象的所有实例之间共享):


如果您是面向对象编程的新手,您可能缺少一个重要的概念,那就是封装

只能从类(或其继承的类)内部访问类的字段(属性)。也就是说,如果我们有一个类的人,只有一个名字,你可以做

public class Person
{
    public string Name;
}
因此,在程序中的任何位置,您都可以通过执行以下操作来访问它:

Person person = new Person();
person.Name = "Andre";
这是可行的,但它不是封装的。在一些语言中,如C++或java,它是这样做的:

BaseCharacter bc = new BaseCharacter();
// use bc.Attributes
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++方式)非常相似,但您将名称视为属性,而不是方法,并将名称属性封装起来

您需要显示一点代码。从错误中可以看出,您试图从类而不是从类的实例访问属性。这确实是问题所在。。真不敢相信我竟然忽略了。你可能需要提出一个新问题。回答问题后,您不应更改该问题:)