黑马程序员技术交流社区

标题: 【分享】C#中属性的一个容易搞错的问题 [打印本页]

作者: 李阳Leo    时间: 2012-9-23 21:59
标题: 【分享】C#中属性的一个容易搞错的问题
在网上看到的,觉得很有用,分享下

猜猜看以下程序的输出是什么?
  1. using System;
  2. using System.Windows.Forms;

  3. namespace Skyiv.Ben.Test
  4. {
  5.     sealed class MainTest
  6.     {
  7.         static void Main()
  8.         {
  9.             Label lblOut = new Label();
  10.             lblOut.Text = null;
  11.             Console.WriteLine("{0} {1}", lblOut.Text == null, lblOut.Text == "");
  12.         }
  13.     }
  14. }
复制代码
该程序的输出是: False True,而不是: True False。也就是说,你将一个null赋值给lblOut.Text,而lblOut.Text的值是""(即string.Empty),而不是null。lblOut.Text是一个属性,实际上,按C#语法,给属性赋值是调用它的set方法,而获取属性的值是调用它的get方法,这两者不必一致,也就是说,你给属性赋一个值,然后再读该属性的值,取到的值就有可能不是你刚刚赋给它的值了。编程时如不小心,就有可能出现BUG。我以前写程序时就出现过这样的错误:
lblOut.Text = GetAccount();
if (lblOut.Text == null) lblOut.Text = "无此账号";
结果这个if语句永远不会取真值。
作者: 许庭洲    时间: 2012-9-24 08:43
class Person
{
      public int Age
     {
            get
            {
                    return 3;
             }
            set
            {

            }
   }
}

Person p1 = new Person();
p1.Age = 30;
p1.Age++;
Console.Write(p1.Age);//输出3
结论 : 一般情况下get读取的值是set设置的值,但是可以让get读取的值不是set设置的值。
作者: 蔡嘉    时间: 2012-9-25 10:50
回楼上,原理应该是new了一个指针对象,才会出现表面上是“赋值了”,实际上指针还在指向原先的存储空间!
作者: 李阳Leo    时间: 2012-9-25 11:38
本帖最后由 李阳_TickTock 于 2012-9-25 11:39 编辑

哥们搞错了,这和指针没有关系

这里说的是类里面的属性

可以参考这个视频
传智播客.NET基础提高视频(2011新版)-03属性.zip
下载地址:
http://122.228.243.41/file/MDAwMDAwMDFthcC-aza87JZ5dIXI3IWWRNBf9YDSNicdFk66cETTTg../86c68fe6379e7b1c51a7603944c826a330949cb/%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2.NET%E5%9F%BA%E7%A1%80%E6%8F%90%E9%AB%98%E8%A7%86%E9%A2%91%EF%BC%882011%E6%96%B0%E7%89%88%EF%BC%89-03%E5%B1%9E%E6%80%A7.zip?key=AAABQFBhO-prN3qP&p=&a=3757868-dfc66f52&mode=download
作者: 蔡嘉    时间: 2012-9-25 12:02

属性是引用类型,除了可被赋值,还会new一个对象吧?
作者: 李阳Leo    时间: 2012-9-25 12:14
蔡嘉 发表于 2012-9-25 12:02
属性是引用类型,除了可被赋值,还会new一个对象吧?

属性怎么会可以new
不可以的,属性就只有一个get 和 set 方法,在里面做逻辑判断的
作者: 蔡嘉    时间: 2012-9-26 16:26
我再认真看下。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2