1

好的,这是我的代码,即使我从书中复制了一个代码并应用了许多限制 throw get 和 set 属性,它也不起作用,但没有任何效果。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication2
{
    class Program
    {
        private string name;
        public string Name
        {
            get 
            {
                return name;
            }
            set
            {
                if (string.IsNullOrEmpty(value))
                      throw new ArgumentNullException("value");

                name = value;

            }

        }
        static void Main(string[] args)
        {
            Program p = new Program();
            p.name = null;
            Console.WriteLine("{0}", p.name);
            Console.ReadLine();
        }
    }
}**

空字符串仍然通过,一点也不例外。难道我做错了什么。

4

4 回答 4

6

您正在name直接设置私有字段,它不会触发Set反对 Property Name

您应该访问属性而不是支持字段。p.name应该如此p.Name

编辑:如果您将属性和相关逻辑放在一个单独的类中会更好,例如:

class SomeClass
{
    private string name;
    public string Name
    {
        get
        {
            return name;
        }
        set
        {
            if (string.IsNullOrEmpty(value))
                throw new ArgumentNullException("value");

            name = value;
        }
    }
}

然后在您的类中创建该类的实例,Program例如:

class Program
{
    static void Main(string[] args)
    {
        SomeClass p = new SomeClass();
        p.Name = null;
        Console.WriteLine("{0}", P.name);
        Console.ReadLine();
    }
}

现在您不会注意到您无法访问name字段,而只能访问public属性Name

于 2013-10-02T14:04:53.850 回答
2

您正在设置name(字段)而不是Name(属性)。您可以从同一文件访问私有字段。这就是为什么(可能是错误地)您能够访问name. 要触发你必须做的异常,

Program p = new Program();
p.Name = null;
于 2013-10-02T14:05:05.530 回答
2

为避免进一步混淆,您可以对局部变量使用下划线约定(尤其是当它们与公共变量同名时)。

例如:

private string _name;
public string Name

我知道这不能回答问题(很多人已经回答了),但从长远来看它会帮助你......而且由于问题与范围有关,我认为它是相关的:P

于 2013-10-02T14:07:05.853 回答
1
p.name = null;

应该p.Name

于 2013-10-02T14:04:50.000 回答