// VS 2015

定义一个Book类:

namespace ConsoleTest
{
public class Book
{
private string _bookIsbn;
private string _bookName;
private string _press;
private string _author;
private short _edition; public string BookIsbn { get { return _bookIsbn; } set { _bookIsbn = value; } } public string BookName {get { return _bookName;} set { _bookName = value; } } public string Press { get { return _press;} set { _press = value; } } public string Author { get {return _author;} set { _author = value; } } public short Edition { get {return _edition;} set { _edition = value; } }
}
}

类似于java的getter和setter方法, C#使用了属性来进行字段的封装。

C#允许在属性内的操作:

  • 还可以在get和set内进行各种操作,比如判断输入是否合法等。
  • 可以声明某一个get或者set的访问性比属性的访问性更严格,不能全部都比属性严格(C#2)
  • 可以实现自动属性。(C#3)

修改如下:

namespace ConsoleTest
{
public class Book
{
private string _bookIsbn; public string BookIsbn { get { return _bookIsbn; } private set { _bookIsbn = value; } } public string BookName { get; private set; } public string Press { get; set; } public string Author { get; set; } public short Edition { get; set; }
}
}

在这个版本代码中,省略了字段保留了属性,并且BookName,Press,Author,Edition均实现了自动属性。C#编译器会自动的将其扩展为和之前的代码一样。

如果查看一下IL代码:(部分)

.class public auto ansi beforefieldinit
ConsoleTest.Book
extends [mscorlib]System.Object
{ .field private string _bookIsbn .field private string '<BookName>k__BackingField'
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor()
= ( )
.custom instance void [mscorlib]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggerBrowsableState)
= ( ) // ........
// int32(0) // 0x00000000 .field private string '<Press>k__BackingField'
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor()
= ( )
.custom instance void [mscorlib]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggerBrowsableState)
= ( ) // ........
// int32(0) // 0x00000000 .field private string '<Author>k__BackingField'
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor()
= ( )
.custom instance void [mscorlib]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggerBrowsableState)
= ( ) // ........
// int32(0) // 0x00000000 .field private int16 '<Edition>k__BackingField'
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor()
= ( )
.custom instance void [mscorlib]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggerBrowsableState)
= ( ) // ........
// int32(0) // 0x00000000 .method public hidebysig specialname instance string
get_BookIsbn() cil managed
{
.maxstack
.locals init (
[] string V_0
) // [7 38 - 7 39]
IL_0000: nop // [7 40 - 7 57]
IL_0001: ldarg. // this
IL_0002: ldfld string ConsoleTest.Book::_bookIsbn
IL_0007: stloc. // V_0
IL_0008: br.s IL_000a // [7 58 - 7 59]
IL_000a: ldloc. // V_0
IL_000b: ret } // end of method Book::get_BookIsbn .method private hidebysig specialname instance void
set_BookIsbn(
string 'value'
) cil managed
{
.maxstack // [7 72 - 7 73]
IL_0000: nop // [7 74 - 7 92]
IL_0001: ldarg. // this
IL_0002: ldarg. // 'value'
IL_0003: stfld string ConsoleTest.Book::_bookIsbn // [7 93 - 7 94]
IL_0008: ret } // end of method Book::set_BookIsbn

可以看到,BookName和Press等属性扩展出了字段,而BookISBN属性被写成了两种方法:

public hidebysig specialname instance string
get_BookIsbn()
以及 private hidebysig specialname instance void
    set_BookIsbn(
string 'value'
)
public string BookIsbn {  private get { return _bookIsbn; } private set { _bookIsbn = value; } }

如果将BookIsbn改为如上形式,编译器会报错,因为get和set都比属性具有更严格访问性。此时的属性其实无用,因为无法从外部进行任何的访问。

public string BookIsbn {  protected get { return _bookIsbn; } private set { _bookIsbn = value; } }

同样,如上的形式也会报错。

如果不对get或者set的访问性进行指定,那么会和属性的访问性一样。但C#禁止对get和set显示声明与属性一样的访问性。下列形式都会报错:

public string Press {  public get; set; }
public string Press { get; public set; }
public string Press { public get; public set; }

C#基础--属性的更多相关文章

  1. Unity UGUI——Rect Transform组件(基础属性)

    基础属性:Width.Height.Pivot图示 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTXJfQUhhbw==/font/5a6L5L2T/fo ...

  2. Android绘图机制(一)——自定义View的基础属性和方法

    Android绘图机制(一)--自定义View的基础属性和方法 自定义View看起来,确实看起来高深莫测,很多Android开发都不是特别在行这一块,这里面的逻辑以及一些绘画都是有一点难的,说一下我目 ...

  3. Silverlight实例教程 - Validation数据验证基础属性和事件(转载)

    Silverlight 4 Validation验证实例系列 Silverlight实例教程 - Validation数据验证开篇 Silverlight实例教程 - Validation数据验证基础 ...

  4. HTML&CSS基础-属性选择器

    HTML&CSS基础-属性选择器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.html源代码 <!DOCTYPE html> <html> & ...

  5. webpack2.x基础属性讲解(一)

      webpack作为构建工具平时作为前端作为优化.模块编程.和分片打包的重要组成部分,大家可能并不陌生,如果没有时刻的去关注文档,那么大家可能不太清楚webpack已经默默然的升级到2.x了,对比1 ...

  6. JS基础属性跟运算

    小编这周学了JS函数基础知识跟运算!!下面就迫不及待跟大家分享一下 [switch case的结构写法] 结构写法:(略) 2注意事项: ①switch结构()中的表达式.可以使用各种js支持的数据类 ...

  7. webpack2.x基础属性讲解

    webpack作为构建工具平时作为前端作为优化.模块编程.和分片打包的重要组成部分,大家可能并不陌生,如果没有时刻的去关注文档,那么大家可能不太清楚webpack已经默默然的升级到2.x了,对比1.x ...

  8. 2.C#面向对象基础属性

    属性: 1.一般属性开头字母大写,字段开头字母小写. 2.通过public来赋值的方法无法判断赋值是否非法! 3.无论赋值如何,取值如果就是不采用赋值的结果,那么无论赋值什么都不管用. 4.经典错误之 ...

  9. JSP基础——属性保存范围和request对象

    JSP属性保存范围 JSP中提供了四种属性保存范围,分别为page,request,session及application. 1.page范围,指设置的属性只在当前页面有效.通过pageContext ...

  10. css_01之基础属性、选择器

    1.  常用属性:①color:文本颜色:②background-color:背景颜色:③font-size:文字大小: 2.  样式声明:①内部样式:style=“样式规则:”,写于作用标签内,优先 ...

随机推荐

  1. Hive中Bucket的应用

    网友南京-李先森给了他收集的一些资料,如下: Buckets 对指定列计算 hash,根据 hash 值切分数据,目的是为了并行,每一个 Bucket 对应一个文件.如将 user 列分散至 32 个 ...

  2. Android简单发送邮件(可带附件)

    项目中遇到了一个发送邮件的功能,在网上查了很多,资料也很多.这里就不一一介绍了,只是写出我使用的方案(最简单的) Intent email = new Intent(android.content.I ...

  3. 【javascript】判断浏览设备是手机还是电脑

    判断页面浏览设备是手机还是电脑,代码如下: function browserRedirect() { var sUserAgent = navigator.userAgent.toLowerCase( ...

  4. 企业架构研究总结(26)——TOGAF架构开发方法(ADM)之实施治理阶段

    1.9 实施治理(Implementation Governance) 企业架构开发方法各阶段——实施治理 1.9.1 目标 本阶段的目标是: 为每个实施计划给予建议. 对涵盖整个实施和部署过程的架构 ...

  5. SQL2008R2 无法读取此系统上以前注册的服务器的列表--网上方法不可行

    C:\Users\<username>\AppData\Local\Temp,然后创建两个命名为1和2的文件夹

  6. 异常信息:java.lang.OutOfMemoryError: PermGen space

    修改TOMCAT_HOME/bin/catalina.sh 在"echo "Using CATALINA_BASE:    $CATALINA_BASE""上面 ...

  7. C# 自动提交到百度ping服务

    C# 自动提交到百度ping服务 今天无意之间看到百度站长中有这个ping服务(孤陋寡闻呀).... 那什么什么是Ping服务 ping是基于XML_RPC标准协议的更新通告服务,用于博客把内容更新快 ...

  8. SQL Server 2008 - Cannot set a credential for principal 'sa'.

    SQL Server 2008 - Cannot set a credential for principal 'sa'. 很久没有用到SQL Server了,今天有幸在帮同事解决一个SQL Serv ...

  9. [Oracle] CPU/PSU补丁安装教程

    什么是CPU/PSU Oracle CPU的全称是Critical Patch Update, Oracle对于其产品每个季度发行一次安全补丁包,通常是为了修复产品中的安全隐患. Oracle PSU ...

  10. Linux:备份

    一.每日备份数据 该脚本backupday.sh用来每日备份你需要备份的文件或目录 使用办法 1)打开脚本修改要备份的目录或文件和备份到的目录(如从A备份到B) 2)修改后运行脚本 需要备份数据时,直 ...