前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C#一句很简单而又很经典的代码

C#一句很简单而又很经典的代码

作者头像
郑子铭
发布2023-10-31 13:10:21
1060
发布2023-10-31 13:10:21
举报
文章被收录于专栏:DotNet NB && CloudNative

一、知识点

二、问题

如果以上四个问题,你很自信,那么以下,您就不要看了,因为我想说的东西真的很简单。

如果你开始怀疑自己,可以继续向下看。你自己到底真的理解吗???

再看下面这段代码有没有问题?

代码语言:javascript
复制
class Program
{
    static void Main(string[] args)
    {
        Transform t = new Transform();
        t.v.x = 1;
        t.ShowV();
        Console.Read();
    }
}

struct Vector
{
    public float x;
    public float y;
    public float z;
}

class Transform
{
    public Vector v { get; set; }
    public void ShowV()
    {
        Console.WriteLine(v.x+"..."+v.y+"..."+v.z);
    }
}

如果你觉得没有问题,那么你需要看看。这时候会编译报错,为啥,怎么回事。

第6行编译报错:

三、分析

如果你非常清楚属性的本质的话,那么上述代码可以进行转换,将属性转换为普通方法。(属性的本质就是方法嘛)

代码语言:javascript
复制


class Program
{
    static void Main(string[] args)
{
        Transform t = new Transform();
        t.GetVector().x = 1;
        t.ShowV();
        Console.Read();
    }
}

struct Vector
{
    public float x;
    public float y;
    public float z;
}
class Transform
{
    public Vector v;
    //set
    public void SetVector(Vector v)
{
        this.v = v;
    }
    //get
    public Vector GetVector()
{
        return v;
    }
    public void ShowV()
{
        Console.WriteLine(v.x + "..." + v.y + "..." + v.z);
    }
}

果然上述的改写只是将属性的写法转为本质写法-写成两个普通的方法。结果还是报一样的编译错误。

编译报错提示还是一样的CS1612

再修改一下 

代码语言:javascript
复制
Transform t = new Transform();
//t.GetVector().x = 10; 这边编译报错
Vector v2 = t.GetVector();
v2.x = 10;
t.ShowV();
Console.Read();

编译打印结构是 0..0..0。

压根就没变,当然没有变啊,因为v2是副本,你更改的只是副本,并没有改变t中的v,同理,通过t.GetVector()也是一个副本,没有意义。

所以C#语法在对于这种情况,帮我们做了一个处理,如果写了这样的代码,直接给出编译报错。C#还是很智能的。就是如果我们错误的进行一个无意义的操作,会直接给出提示。这里给C#语法赞一个。

四、杂谈

这一段代码虽然好像很简单,但是真的藏的很深,楼主工作三年。记得曾经有一次去网易二面,被一个大佬问到这个问题,懵逼了,就乱猜吧,一开始说,那个枚举值中的x只是get,没有set。然后大佬提示我不是的,然后我才误打误撞,恍然大悟,是因为枚举值传递是副本传递,再进行赋值操作没有意义。现在想想,能出这个问题的大佬,真的很强,一道很简单的问题,但是考察的东西真的很多很多。

推荐阅读:

一个简单高效低内存的.NET操作Excel开源框架 - MiniExcel

推荐一个基于 .NET 开发的开源工作流项目

推荐一个使用 .NET 和 Angular 开发的在线任务管理工具

基于.NET的强大文件格式开源转换工具

字符串 --- 不可变性与驻留池

Dotnet工具箱:开源、免费的纯前端工具网站,带你探索10大工具分类和73个实时在线小工具

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-10-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet NB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档