A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

在网上看到的,觉得很有用,分享下

猜猜看以下程序的输出是什么?
  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语句永远不会取真值。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

6 个回复

倒序浏览
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设置的值。
回复 使用道具 举报
回楼上,原理应该是new了一个指针对象,才会出现表面上是“赋值了”,实际上指针还在指向原先的存储空间!

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 李阳_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
回复 使用道具 举报

属性是引用类型,除了可被赋值,还会new一个对象吧?
回复 使用道具 举报
蔡嘉 发表于 2012-9-25 12:02
属性是引用类型,除了可被赋值,还会new一个对象吧?

属性怎么会可以new
不可以的,属性就只有一个get 和 set 方法,在里面做逻辑判断的
回复 使用道具 举报
蔡嘉 中级黑马 2012-9-26 16:26:26
7#
我再认真看下。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马