Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.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中的属性sharp不工作_C#_C# 4.0 - Fatal编程技术网

C# 获取和设置c中的属性sharp不工作

C# 获取和设置c中的属性sharp不工作,c#,c#-4.0,C#,C# 4.0,好的,这是我的代码,它不起作用,即使我从书中复制了一个代码,并应用了许多限制,抛出get和set属性,但什么都不起作用 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication2 { class Program { private s

好的,这是我的代码,它不起作用,即使我从书中复制了一个代码,并应用了许多限制,抛出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();
        }
    }
}**
空字符串仍然可以通过,并且没有任何异常。我做错什么了吗

p.name = null;
应该是p.Name


应为p.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;
        }
    }
}
class Program
{
    static void Main(string[] args)
    {
        SomeClass p = new SomeClass();
        p.Name = null;
        Console.WriteLine("{0}", P.name);
        Console.ReadLine();
    }
}
然后在程序类中创建该类的实例,如:

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

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

现在,您不会注意到您不能访问名称字段,而是只能访问公共属性名称。如果您直接设置私有字段名称,它将不会触发针对属性名称的设置

您应该访问属性,而不是备份字段。所以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;
        }
    }
}
class Program
{
    static void Main(string[] args)
    {
        SomeClass p = new SomeClass();
        p.Name = null;
        Console.WriteLine("{0}", P.name);
        Console.ReadLine();
    }
}
然后在程序类中创建该类的实例,如:

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

            name = value;
        }
    }
}
class Program
{
    static void Main(string[] args)
    {
        SomeClass p = new SomeClass();
        p.Name = null;
        Console.WriteLine("{0}", P.name);
        Console.ReadLine();
    }
}
现在,您将不会注意到您无法访问名称字段,而是只访问公共属性名称,您正在设置的是namefield而不是Nameproperty。 您可以从同一文件访问专用字段。这就是为什么您可能会错误地访问name。要触发您必须执行的异常

Program p = new Program();
p.Name = null;
您正在设置namefield而不是Nameproperty。 您可以从同一文件访问专用字段。这就是为什么您可能会错误地访问name。要触发您必须执行的异常

Program p = new Program();
p.Name = null;

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

例如:

private string _name;
public string Name

我知道这并不能回答许多人已经提出的问题,但从长远来看,这将对你有所帮助……而且由于问题涉及范围,我认为这是相关的:p

为了避免进一步的混淆,你可以对局部变量使用下划线约定,特别是当它们与公共变量同名时

例如:

private string _name;
public string Name

我知道这并没有回答很多人已经提出的问题,但从长远来看,它将帮助您…而且由于问题与范围有关,我认为它是相关的:p

p.Name而不是p.Name为什么Console.WriteLine{0},p.Name;?做Console.WriteLinep.name;,不是更简单、更等效吗;?实际上,我正在console.writeline中编写一些消息和其他内容,但当我复制它时,我删除了所有内容。p.Name不是p.Name为什么console.writeline{0},p.Name;?做Console.WriteLinep.name;,不是更简单、更等效吗;?实际上,我在console.writeline中写了一些消息和其他东西,但当我复制它时,我删除了所有内容。出于兴趣,为什么要编译它?我知道该字段是从同一个类访问的,但它是从静态上下文访问的,它引用的字段不在该上下文中。我本以为它会生成一个编译器错误,但它没有…@Habib将第二个P.Name更改为P.Name。我会的,但只有一个letter@Sean,Main是静态方法,但它本身正在创建程序类的实例。它不是直接访问实例成员。@Habib它们都应该是小写而不是大写=P@Habib谢谢你把它清理干净。一个问题是,如果对象可以更改字段数据,那么使用get和set方法有什么意义呢?它不应该限制对该字段的所有访问。出于兴趣,为什么要编译它?我知道该字段是从同一个类访问的,但它是从静态上下文访问的,它引用的字段不在该上下文中。我本以为它会生成一个编译器错误,但它没有…@Habib将第二个P.Name更改为P.Name。我会的,但只有一个letter@Sean,Main是静态方法,但它本身正在创建程序类的实例。它不是直接访问实例成员。@Habib它们都应该是小写而不是大写=P@Habib谢谢你把它清理干净。一个问题是,如果对象可以更改字段数据,那么使用get和set方法有什么意义?它不应该限制对该字段的所有访问吗。