// 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. ul和li实现分两列(多列)布局显示

    简单语句实现DIV+CSS分两列(多列)布局显示 <style type="text/css"> .my ul { width: 210px; } .my li { w ...

  2. jQuery EasyUI 1.3.4 离线API、Demo

    [原]jQuery EasyUI 1.3.4 离线API.Demo (最新)   说明 本文下载包为 jQuery EasyUI 1.3.4 离线API.Demo. API 按照分类整理做成了离线版本 ...

  3. 多平台Client TCP通讯组件

    Beetle.NetPackage是一个多平台Client Socket TCP通讯组件(Apache License 2.0),组件制统一的对象协议制定规则,可以灵活方便地通过对象来描述TCP通讯交 ...

  4. DataSet、DataTable、DataRow 复制

    DataSet.DataTable.DataRow 复制 DataSet 对象是支持 ADO.NET的断开式.分布式数据方案的核心对象 ,用途非常广泛.我们很多时候需要使用其中的数据,比如取得一个Da ...

  5. <mate>标签中属性/值的各个意思

    <mate>标签中属性/值的各个意思 HTML 4 name 属性 1.<mate name="author" content="" /> ...

  6. MacOSX64位机器上gcc编译32位x264静态库

    x264最新包地址:http://www.videolan.org/developers/x264.html 编译命令: ./configure --enable-static --host=i386 ...

  7. ZOJ 1204 一个集合能组成多少个等式

    Additive equations Time Limit : 20000/10000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other ...

  8. while循环的基本用法

    while是常用的循环结构之一 1.格式: while(条件){ } 2.基本知识点 1)puts(“字符串”).换行输出一个字符串 2)死循环.. while(1){ } 代码如下:

  9. 惊喜:opera换webkit内核后完美支持SDCH压缩协议

    csdn发邮件警告说再不发文章就取消我的专家头衔了.呵呵,其实我只是在csdn暴露了我的帐号密码以后不得已把csdn密码修改成一个我自己都记不住的货,所以很少上来了. 言归正传.我们从去年就在QQ空间 ...

  10. Execl导入问题之文本转换

    前些天在基础数据的导入过程中,遇到了这样一个问题:数据明明存在,可是就是不识别!给出的错误提示是:该数据对应的外键不存在! 我找出其中的一条数据,在外键表中查询是存在的!问题出在哪里了呢? 从exec ...