首页 技术 正文
技术 2022年11月16日
0 收藏 966 点赞 4,316 浏览 2758 个字

系列目录    【已更新最新开发文章,点击查看详细】

在 C# 3.0 及更高版本,当属性访问器中不需要任何其他逻辑时,自动实现的属性会使属性声明更加简洁。 它们还允许客户端代码创建对象。 当你声明以下示例中所示的属性时,编译器将创建仅可以通过该属性的 get 和 set 访问器访问的专用、匿名支持字段。

下列示例演示一个简单的类,它具有某些自动实现的属性:

// 该类是可变的。它的数据可以从类外部修改
class Customer
{
// 用于普通get和set的自动实现属性
public double TotalPurchases { get; set; }
public string Name { get; set; }
public int CustomerID { get; set; } // 构造函数
public Customer(double purchases, string name, int ID)
{
TotalPurchases = purchases;
Name = name;
CustomerID = ID;
} // 方法
public string GetContactInfo() { return "ContactInfo"; }
public string GetTransactionHistory() { return "History"; } // 其他的方法、事件等
}class Program
{
static void Main()
{
// 初始化一个新对象
Customer cust1 = new Customer(4987.63, "Northwind", ); // 修改属性
cust1.TotalPurchases += 499.99;
}
}

在 C# 6 和更高版本中,你可以像字段一样初始化自动实现属性:

public string FirstName { get; set; } = "Jane";

上一示例中所示的类是可变的。 创建客户端代码后可以用于更改对象中的值。 在包含重要行为(方法)以及数据的复杂类中,通常有必要具有公共属性。 但是,对于较小类或仅封装一组值(数据)且只有很少行为或没有行为的结构,则应该通过声明 set 访问器为专用(对使用者的不可变)或通过声明仅一个 get 访问器(除构造函数外都不可变),使对象不可变。

使用自动实现的属性实现轻量类

本示例演示如何创建一个仅用于封装一组自动实现的属性的不可变轻型类。 当你必须使用引用类型语义时,请使用此种构造而不是结构。

可通过两种方法来实现不可变的属性:

  • 可以将 set 访问器声明为专用。 属性只能在该类型中设置,但它对于使用者是不可变的。

    当你声明一个 private set 取值函数时,你无法使用对象初始值设定项来初始化属性。你必须使用构造函数或工厂方法。

  • 也可以仅声明 get 访问器,使属性除了能在该类型的构造函数中可变,在其他任何位置都不可变。

下面的示例演示了实现具有自动实现属性的不可变类的两种方法。 这两种方法均使用 private set 声明其中一个属性,使用单独的 get 声明另一个属性。 第一个类仅使用构造函数来初始化属性,第二个类则使用可调用构造函数的静态工厂方法。

 // 这个类是不可变的。创建对象后,不能从类外部修改它。它使用构造函数初始化其属性。
class Contact
{
// 公共只读属性
public string Name { get; }
public string Address { get; private set; } // 公共构造函数
public Contact(string contactName, string contactAddress)
{
Name = contactName;
Address = contactAddress;
}
} // 这个类是不可变的。创建对象后,不能从类外部修改它。它使用静态方法和私有构造函数初始化其属性。
public class Contact2
{
// 公共只读属性
public string Name { get; private set; }
public string Address { get; } // 私有构造函数
private Contact2(string contactName, string contactAddress)
{
Name = contactName;
Address = contactAddress;
} // 共有工厂方法
public static Contact2 CreateContact(string name, string address)
{
return new Contact2(name, address);
}
} public class Program
{
static void Main()
{
string[] names = {"Terry Adams","Fadi Fakhouri", "Hanying Feng",
"Cesar Garcia", "Debra Garcia"};
string[] addresses = {"123 Main St.", "345 Cypress Ave.", "678 1st Ave",
"12 108th St.", "89 E. 42nd St."}; // 在 select 子句中演示对象创建的简单查询。使用构造函数创建contact对象。
var query1 = from i in Enumerable.Range(, )
select new Contact(names[i], addresses[i]); // 列表元素不能由客户端代码修改。
var list = query1.ToList();
foreach (var contact in list)
{
Console.WriteLine("{0}, {1}", contact.Name, contact.Address);
} // 使用静态工厂方法创建contact2对象。
var query2 = from i in Enumerable.Range(, )
select Contact2.CreateContact(names[i], addresses[i]); // 控制台输出与query1相同。
var list2 = query2.ToList(); // 列表元素不能由客户端代码修改。
// CS0272:
// list2[0].Name = "Eugene Zabokritski"; // 在调试模式下保持控制台打开。
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
} /* 输出:
Terry Adams, 123 Main St.
Fadi Fakhouri, 345 Cypress Ave.
Hanying Feng, 678 1st Ave
Cesar Garcia, 12 108th St.
Debra Garcia, 89 E. 42nd St.
*/

编译器为每个自动实现的属性创建了支持字段。 这些字段无法直接从源代码进行访问。

系列目录    【已更新最新开发文章,点击查看详细】

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,942
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,466
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,281
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,095
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,728
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,765