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

一.知识点

二.问题

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

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

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

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行编译报错:

三.分析

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

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

再修改一下 

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。然后大佬提示我不是的,然后我才误打误撞,恍然大悟,是因为枚举值传递是副本传递,再进行赋值操作没有意义。现在想想,能出这个问题的大佬,真的很强,一道很简单的问题,但是考察的东西真的很多很多。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。

(0)

相关推荐

  • c# Base64编码和图片的互相转换代码

    事出有因 我们已经做了一个编辑器,这个编辑器可以以xml格式存储一些信息.在存储图片信息时我们碰到了一些问题.我们本来在xml信息中存储的是图片的路径,然而一旦客户把这个信息copy到其他电脑上而没有同时copy相关的图片时,就会出现一些问题.          后来,我们把图片数据转换为Base64编码,替代了原先存储图片路径的方式. 转换流程 将图片转化为Base64字符串的流程是:首先使用BinaryFormatter将图片文件序列化为二进制数据,然后使用Convert类的ToBase64

  • c#将Excel数据导入到数据库的实现代码

    假如Excel中的数据如下: 数据库建表如下: 其中Id为自增字段: 代码: 复制代码 代码如下: using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using System.Data;using System.Data.OleDb;using System.Configuratio

  • C# WORD操作实现代码

    1.先通过程序生成报表样式的HTML页面,然后修改HTML页面的后缀名为DOC. 2.定制WORD文档的模板文件,在C#中操作WORD模板,生成新的WORD文档. 第一方案简单,只需要改动文件的扩展名就行了,但是也存在了一些问题,譬如生成的WORD文档样式的丢失.这样对于客户来说可能是一个无法通过的方案.第二方案比较复杂,需要调用OFFICE的WORD组件通过C#来操作WORD,进而生成WORD.此方法类似于我们在c#中的后台拼接数据.虽然麻烦,但是能够灵活定制,只不过是操作WORD对象而已.

  • C#操作mysql数据库的代码实例

    直接看代码 复制代码 代码如下: using System;using System.Configuration;using MySql.Data.MySqlClient;/// <summary>/// TestDatebase 的摘要说明/// </summary>public class TestDatebase{    public TestDatebase()    {        //        // TODO: 在此处添加构造函数逻辑        //   

  • c#实现16进制和字符串之间转换的代码

    十六进制字符串与数值类型之间转换(C# 编程指南) 以下示例演示如何执行下列任务: 获取字符串中每个字符的十六进制值. 获取与十六进制字符串中的每个值对应的字符. 将十六进制 string 转换为整型. 将十六进制 string 转换为浮点型. 将字节数组转换为十六进制 string. 示例 此示例输出 string 中的每个字符的十六进制值.首先,它将 string 分析为字符数组,然后对每个字符调用 ToInt32(Char) 以获取相应的数字值.最后,在 string 中将数字的格式设置为

  • C# XML操作 代码大全(读XML,写XML,更新,删除节点,与dataset结合等)第1/2页

    已知有一个XML文件(bookstore.xml)如下: Corets, Eva 5.95 1.插入节点 往节点中插入一个节点: 复制代码 代码如下: XmlDocument xmlDoc=new XmlDocument(); xmlDoc.Load("bookstore.xml"); XmlNode root=xmlDoc.SelectSingleNode("bookstore");//查找 XmlElement xe1=xmlDoc.CreateElement(

  • C# TreeView控件使用代码

    当前选中项:TreeView.SelectedNode 增加顶级节点:TreeView.Nodes.Add("Key", "Text") 增加同级节点:TreeView.SelectedNode.Parent.Nodes.Add("Key", "Text") 增加子节点:TreeView.SelectedNode.Nodes.Add("Key", "Text") 全部展开:TreeVie

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

    一.知识点 二.问题 如果以上四个问题,你很自信,那么以下,您就不要看了,因为我想说的东西真的很简单. 如果你开始怀疑自己,可以继续向下看.你自己到底真的理解吗??? 再看下面这段代码有没有问题? class Program { static void Main(string[] args) { Transform t = new Transform(); t.v.x = 1; t.ShowV(); Console.Read(); } } struct Vector { public float

  • 使用 js 简单的实现 bind、call 、aplly代码实例

    这篇文章主要介绍了使用 js 简单的实现 bind.call .aplly代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Function.prototype._call = function(obj,...arg){ var me = this; var k = Symbol("test"); //生成唯一的 key obj[k] = me; var result = obj[k](...arg); delete obj[k

  • 编写你的shell其实很简单

    引语:我本人以前并没有写过shell脚本,也许是因为懒,也许是没有被逼到要去写shell的地步.但是,前段时间,工作需求,要求重新跑几个月的脚本,这些脚本是每天定时进行跑的,而且每天是好几个脚本一起关联跑的.你也许会说,这太简单了,写个循环,然后,让他自己去跑就行了.是的,你可以很顺手的用你的编程语言去写循环,如PHP.但是,你知道,这样做其实是改变了代码结构了,鬼知道会导致什么结果呢? 并且,我并不保证里面所有代码的意思,我都懂!那么,问题来了,在不改变原代码的前提下,怎样去循环这几个月的时间

  • 一个很简单的jquery+xml+ajax的无刷新树结构(无css,后台是c#)

    复制代码 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data.Linq; using System.Xml; using System.Xml.Linq; namespace WebApplication3 { public

  • 很简单的Java断点续传实现原理

    原理解析 在开发当中,"断点续传"这种功能很实用和常见,听上去也是比较有"逼格"的感觉.所以通常我们都有兴趣去研究研究这种功能是如何实现的? 以Java来说,网络上也能找到不少关于实现类似功能的资料.但是呢,大多数都是举个Demo然后贴出源码,真正对其实现原理有详细的说明很少. 于是我们在最初接触的时候,很可能就是直接Crtl + C/V代码,然后捣鼓捣鼓,然而最终也能把效果弄出来.但初学时这样做其实很显然是有好有坏的. 好处在于,源码很多,解释很少:如果我们肯下功

  • 做了个flash对mc移动的控制,代码很简单:)

    复制代码 代码如下: 里面创建了4个MC,分别是zzcn_top_mc zzcn_end_mc zzcn_left_mc zzcn_right_mc . 很简单的..大家可以参考下哦..呵呵.. var place_x:Number = _xmouse; var place_y:Number = _ymouse; var sulv:Number = 6; zzcn_top_mc.onEnterFrame = function(){     this._x += (place_x - this._

  • Spring测试 其实很简单

    在过去的职业生涯里,我经常发现有些人不写测试代码,而他们声称不写的理由是无法轻易地写出覆盖多个不同模块的测试用例.好吧,我相信他们中的大部分要么是缺乏一些比较易掌握的技术手段,要么就是没时间来把它搞清楚,毕竟工作中总会有进度之类的各种压力.因为不知道该如何测试,所以就经常忽略集成测试,由此带来的问题就是越来越糟糕的软件.越来越多的BUG和更加失望的客户.所以我想分享一些个人的经验,揭开集成测试神秘的面纱. 如何对基于Spring的工程更好地进行集成测试 使用工具: Spring, JUnit,

  • 不能再简单的无闪刷新验证码原理很简单

    只有这一段事件触发语句全搞定 onclick='this.src="GifCode.asp#"+new Date().getTime()' // GifCode.asp 验证码的图片 事件: onclick='this.src="GifCode.asp#"+new Date().getTime()' 呵呵! 很简单很简单很简单,没想到吧 同理可以在ASP.NET PHP JSP 中运用

  • Linux并发执行很简单,这么做就对了

    &的并发功能 time for i in `grep server /etc/hosts | awk '{print $1}'`; do (ssh $i "echo 123; sleep 1; echo 456" &); done real 0m0.063s user 0m0.016s sys 0m0.004s xargs的并发功能 time grep server /etc/hosts | awk '{print $1}' | xargs -P 24 -I {} ss

  • 安装Redis就那么几步,很简单

    这段时间在做自己的网站,网站里用到了redis服务,redis的水很深,一时半会儿也摸不到底.这篇文章从安装开始,手把手教大家快速安装和使用redis. Redis是一种非关系型数据库(NoSQL),NoSQL是以key-value的形式存储,和传统的关系型数据库不一样,不一定遵循传统数据库的一些基本要求,比如说SQL标准,ACID属性,表结构等等,这类数据库主要有以下特点:非关系型的.分布式的.开源的.水平可扩展的. NoSQL使用场景:对数据高并发读写.对海量数据的高效率存储和访问.对数据的

随机推荐