C# 获取和设置c中的属性sharp不工作
好的,这是我的代码,它不起作用,即使我从书中复制了一个代码,并应用了许多限制,抛出get和set属性,但什么都不起作用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
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
我知道这并没有回答很多人已经提出的问题,但从长远来看,它将帮助您…而且由于问题与范围有关,我认为它是相关的:pp.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方法有什么意义?它不应该限制对该字段的所有访问吗。