参考:http://blog.csdn.net/onlyou930/article/details/5568319
下面写一个新的例子:
using System;
using System.Collections.Generic;
using System.Data.SQLite;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
public struct Rectangle
{
private int height;
public int Height
{
get { return height; }
set { height = value; }
} private int width;
public int Width
{
get { return width; }
set { width = value; }
} public Rectangle(int a,int b)
{
height = a;
width = b;
}
} class Program
{
static void Main(string[] args)
{
List<Rectangle> rectangle = new List<Rectangle>() { new Rectangle() };
rectangle[].Height = ;
rectangle[].Width = ;
} }
}
代码写完之后,有代码有错误:
编译生成后“错误列表”中显示:
出现这个问题的原因分析:
在以上代码中,rectangle是引用类型,rectangle的对象在堆上,虽然rectangle[0]是值类型,但它是rectangle的组成部分,仍然在堆上,而值类型默认是按值传递,所以将rectangle[0]的值做临时的拷贝到栈上,我们暂且称之为temp_rectangle[0],
temp_rectangle[0].Height=20;
temp_rectangle[0]的值是变了,但是rectangle[0]的值并不会改变,所以上面错误代码中的赋值操作是没有意义的,故编译器直接不让编译通过。
在实际中,我们通常似乎需要完成类似的功能,那怎么办呢?有两种解决途径,1)将struct改成class,class是引用类型,就不存在值传递的问题了;2)做一个对象替换,具体代码如下:
class Program
{
static void Main(string[] args)
{
//List<Rectangle> rectangle = new List<Rectangle>() { new Rectangle() };
var rectangle = new Rectangle();
rectangle.Height = ;
rectangle.Width = ;
List<Rectangle> listRectangle = new List<Rectangle>() { rectangle};
}
}
Height和Width的值如下:
解决方案2用新的对象替代了原来的对象。
总结完毕。
有关C# struct的一个误区的更多相关文章
-
转载 Golang []byte与string转换的一个误区
Golang []byte与string转换的一个误区 https://www.oyohyee.com/post/Note/golang_byte_to_string/ 2019-08-10 23:4 ...
-
C# 反射结构体struct的一个坑
今天代码用到了反射赋值,代码是这样写的: var objtype = obj.GetType(); var Fieldinfo = objtype.GetField("I64"); ...
-
使用 memoryview 和 struct 查看一个 GIF 图像的首部
>>> import struct >>> fmt = '<3s3sHH' # ➊ >>> with open('filter.gif', ...
-
java字符串常量池——字符串==比较的一个误区
转自:https://blog.csdn.net/wxz980927155/article/details/81712342 起因 再一次js的json对象的比较中,发现相同内容的json对象使用 ...
-
一个误区(关于javascript的字符串拼接)
前段时间听说了一个问题,说是,javascript中使用+=来拼接字符串会比使用Array的join方法慢几十倍以上,今天在工作间歇,就写了个例 子验证了一下,结果确完全相反,使用+=比join要快( ...
-
request方法传入动态参数的一个";误区";
晚上写了一个请求类,传了一个动态参数进去,实例化测试的时候,发现请求数据根本没法读到,先附上代码 import requests class MyRequests: def send_request( ...
-
javascript给输入框赋值的一个误区
一. 错误的示范 如下代码所示,如果需要用javascript获取id为username1, password1的输入框的值,将其写入id为username2, password2的输入框,那么红线区 ...
-
备份spfile 中的一个误区
某书载在备份控制文件的时候,也会自动的备份初始化参数文件,抱着愚钝的 完事亲力亲为的态度,做了如下的小验证. RMAN> list backup of controlfile; specific ...
-
MAX函数和GROUP BY 语句一起使用的一个误区
使用MAX 函数和 GROUP 的时候会有不可预料的数据被SELECT 出来.下面举个简单的例子:想知道每个SCOREID 的 数学成绩最高的分数. 表信息:/*DDL Information For ...
随机推荐
-
HOJ 1797 Red and Black
传送门 http://acm.hit.edu.cn/hoj/problem/view?id=1797 总体的思路是遍历可以到达的' . ',将其对应的vis数组化为1,然后统计所有为1的vis项; ...
-
oracle数据库中的表设置主键自增
oracle中没有自增字段,可通过序列+触发器间接实现,cmd中sqlplus登录,直接运行即可.一般要经过一下几步: 1建立数据表 create table Test_Increase( ...
-
HTML5-javascript屏幕旋转事件:onorientationchange
屏幕旋转事件:onorientationchange 添加屏幕旋转事件侦听,可随时发现屏幕旋转状态(左旋.右旋还是没旋) 判断屏幕是否旋转 function orientationChange() { ...
-
Swift中出现“no such module cocoa”的错误
在Swift开发中,新建了一个UIViewController的子类出现“No such module 'Cocoa' 的错误, 头部是import cocoa.. 原因很简单:在建立新的File文件 ...
-
js改变div宽度
document.getElementById('Content_Right_id').style.width = document.documentElement.clientWidth - 250 ...
-
Oracle 11g数据库详细安装过程
1.Oracle 11g下载 官方网址为:http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.h ...
-
MFC CStdioFile
读Text文件 void CNWiReworkDlg::ReadHexFile() { using namespace std; CStdioFile file; file.Open(hexFileP ...
-
apache常见的一些配置
<VirtualHost *:80>ServerName www.aliyun.com #域名ServerAlias www.aliyun.com #别名DocumentRoot /dat ...
-
UINavigationController popToViewController用法
popToViewController用法 [self.navigationController popToViewController:[self.navigationController.vie ...
-
docker stack命令
启动docker docker stack deploy -c compose-filename.yml service-name docker stack rm service-name