Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.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# 为私有对象属性创建访问器方法-枚举?_C#_Enumeration_Accessor - Fatal编程技术网

C# 为私有对象属性创建访问器方法-枚举?

C# 为私有对象属性创建访问器方法-枚举?,c#,enumeration,accessor,C#,Enumeration,Accessor,我正在学习访问器方法和枚举。我在名称空间“Vehicles”下编写了一个公共类“Car”,并设置私有属性,如“制造商”、“型号”、“年份”和“颜色”。我想写一个方法来访问属性,另一个方法来设置/更新属性。这是我的班级: using System; namespace Vehicles { public class Car { private string _manufacturer; private string _model;

我正在学习访问器方法和枚举。我在名称空间“Vehicles”下编写了一个公共类“Car”,并设置私有属性,如“制造商”、“型号”、“年份”和“颜色”。我想写一个方法来访问属性,另一个方法来设置/更新属性。这是我的班级:

using System;

namespace Vehicles
{
    public class Car
    {
        private string _manufacturer;
        private string _model;
        private string _year;
        private string _color;

        public void honkHorn()
        {
            // Add argument for a file name?
            // Code here to play a WAV file?
            MessageBox.Show("Honk!");
        }

        public string getCarInfo(string whichProperty)
        {
            switch (whichProperty)
            {
                case ("manufacturer"):
                   return _manufacturer;
                case ("model"):
                    return _model;
                case ("year"):
                    return _year;
                case ("color"):
                    return _color;
                default:
                    return null;
            }
        }

        public void setCarInfo(string whichProperty, string newValue)
        {
            switch (whichProperty)
            {
                case ("manufacturer"):
                    _manufacturer = newValue;
                    break;
                case ("model"):
                    _model = newValue;
                    break;
                case ("year"):
                    _year = newValue;
                    break;
                case ("color"):
                    _color = newValue;
                    break;
            }
        }
    }
}
这是我的表格:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Vehicles;

namespace CS_Enumeration
{
    public partial class Form1 : Form
    {
        public Car myCar = new Car();

        public Form1()
        {
            InitializeComponent();

            myCar.setCarInfo("manufacturer", "Ford");
            labelManfValue.Text = myCar.getCarInfo("manufacturer");

            myCar.setCarInfo("model", "Ranger");
            labelModelValue.Text = myCar.getCarInfo("model");

            myCar.setCarInfo("year", "2012");
            labelYearValue.Text = myCar.getCarInfo("year");

            myCar.setCarInfo("color", "Blue");
            labelColorValue.Text = myCar.getCarInfo("color");
        }

        private void button1_Click(object sender, EventArgs e)
        {
            myCar.honkHorn();
        }
    }
}
这真的是编写可以获取/设置的单个方法的最佳方法吗?我首先尝试强制转换一个与对象属性名称匹配的字符串值并返回实际属性,但这不起作用(除非有人知道如何将字符串强制转换为对象属性?)


谢谢你的回复。这都是我正在读的一本书中的练习。它甚至说,不是所有的东西都应该是公开的,但也不是所有的东西都应该是私人的。那么,我如何知道什么时候事情应该/不应该是公共/私人的呢?听起来这本书在什么是好的编码设计上把我引向了错误的方向。任何人对学习Visual C的良好编码设计实践有任何书籍建议吗?

您可以通过反射来实现这一点:

void Main()
{
    var foo = new Foo();
    foo.Set("bar","test");
    Console.WriteLine(foo.Get("bar"));
}
class Foo
{
    string bar;
    string bop;

    public void Set(string name, string value)
    {
        GetType().GetField(name, BindingFlags.NonPublic|BindingFlags.Instance)
                 .SetValue(this, value);
    }

    public string Get(string name)
    {
        return (string)GetType().GetField(name, BindingFlags.NonPublic|BindingFlags.Instance)
                                .GetValue(this);
    }
}

但这是一个非常糟糕的主意。

您可以通过反射来实现这一点:

void Main()
{
    var foo = new Foo();
    foo.Set("bar","test");
    Console.WriteLine(foo.Get("bar"));
}
class Foo
{
    string bar;
    string bop;

    public void Set(string name, string value)
    {
        GetType().GetField(name, BindingFlags.NonPublic|BindingFlags.Instance)
                 .SetValue(this, value);
    }

    public string Get(string name)
    {
        return (string)GetType().GetField(name, BindingFlags.NonPublic|BindingFlags.Instance)
                                .GetValue(this);
    }
}
但这是一个非常糟糕的主意。

不要这样做

改为使用公共属性,您可以获得类型安全性和类的更具表现力的使用。在当前方法中,属性名称字符串中的任何键入都将导致运行时异常,而不是编译错误

仅使用属性:

public class Car
{
   public string Manufacturer {get; set;}
   public string Model {get; set;}
   public string Year {get; set;}
   public string Color {get; set;}

  //..
}
现在,您可以直接访问属性:

myCar.Manufacturer  = "Ford";
labelManfValue.Text = myCar.Manufacturer;
您还应该定义一个完全初始化Car对象的构造函数,否则您可能会设置一些属性,而其他属性则不会设置。

不要这样做

改为使用公共属性,您可以获得类型安全性和类的更具表现力的使用。在当前方法中,属性名称字符串中的任何键入都将导致运行时异常,而不是编译错误

仅使用属性:

public class Car
{
   public string Manufacturer {get; set;}
   public string Model {get; set;}
   public string Year {get; set;}
   public string Color {get; set;}

  //..
}
现在,您可以直接访问属性:

myCar.Manufacturer  = "Ford";
labelManfValue.Text = myCar.Manufacturer;

您还应该定义一个完全初始化Car对象的构造函数,否则您可能会设置一些属性,而其他属性则没有设置。

为什么要这样做?在我看来,这是一个可怕的设计——只需公开属性。最重要的是,在当前的方法中,您失去了所有的类型安全性,任何输入错误都会导致运行时异常,请参见编辑我的原始帖子。这一切都基于我正在阅读的一本C#书,建议使用私有变量。我可以从get/set属性的经历中看出这有点荒谬。谢谢。这是什么书?我们想忽略它,甚至可能嘲笑它。@JohnSaunders谢谢。显然,这是头部优先,而不是大脑优先。你为什么要这样做?在我看来,这是一个可怕的设计——只需公开属性。最重要的是,在当前的方法中,您失去了所有的类型安全性,任何输入错误都会导致运行时异常,请参见编辑我的原始帖子。这一切都基于我正在阅读的一本C#书,建议使用私有变量。我可以从get/set属性的经历中看出这有点荒谬。谢谢。这是什么书?我们想忽略它,甚至可能嘲笑它。@JohnSaunders谢谢。显然,它是头优先的,而不是脑优先的。要定义构造函数,我是将属性添加到类定义中,还是与enum有关?构造器是否看起来像
公共类汽车(字符串制造商)
是-像这样。至于公共/私人辩论-根据您的示例,您显然希望从外部读取这些属性,因此,至少有一个只读属性——而且属性被编译成具有相同类型的支持字段的getter/setter方法——这基本上等同于您试图用setter方法实现的功能。我相信在实例化对象时,即使我没有定义构造函数,我仍然可以初始化变量,对吗?类似于
Car-porche=new-Car({u-speed=fast;})
要定义构造函数,我是将属性添加到类定义中,还是与enum有关?构造器是否看起来像
公共类汽车(字符串制造商)
是-像这样。至于公共/私人辩论-根据您的示例,您显然希望从外部读取这些属性,因此,至少有一个只读属性——而且属性被编译成具有相同类型的支持字段的getter/setter方法——这基本上等同于您试图用setter方法实现的功能。我相信在实例化对象时,即使我没有定义构造函数,我仍然可以初始化变量,对吗?类似于
carporche=新车({u speed=fast;})