struct和List打仗了 大家来看看

zhangzm1117 2012-03-31 03:55:14
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace ListRead
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private List<StructTest> poList = null;
private void button1_Click(object sender, EventArgs e)
{
poList = new List<StructTest>();
for (int i = 0; i < 3; i++)
{
StructTest oTemp = new StructTest();
oTemp.Str1 = "AA";
oTemp.Str2 = "AA";
poList.Add(oTemp);
}
}

private void button2_Click(object sender, EventArgs e)
{
for (int i = 0; i < poList.Count; i++)
{
poList[i].Str1 = "BB";
poList[i].Str2 = "BB";
}
}

public struct StructTest
{
public string Str1;
public string Str2;
}
}
}

上面的代码直接编译通过不了 大家积极探讨下
...全文
144 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
orochiheart 2012-03-31
  • 打赏
  • 举报
回复
谁赢了?
cheng2005 2012-03-31
  • 打赏
  • 举报
回复
public struct Symbol
{
public int Code;
public Symbol(int code)
{
Code = code;
}
}

List<Symbol> s1 = new List<Symbol>();
Symbol[] s2 = new Symbol[1];
s1.Add(new Symbol(1));
s2[0] = new Symbol(2);

s1[0].Color = 10; ----报错
s2[0].Color = 20; ----不报错

这个应该在前面
cheng2005 2012-03-31
  • 打赏
  • 举报
回复
public class Test
{
public Symbol MySymbol { get; set; }
public Symbol GetSymbol()
{
return new Symbol(10);
}

Test()
{
this.symbol.Code = 10; //这也是会报错的。
GetSymbol().Code = 10;//这还是会报错。
}
}

这是因为C#的return处理,如果传的是引用类型,传递的是一个引用,如果是值类型,则传递的是拷贝。所以对return回来的值类型做修改只是修改的一个副本,这很容易引起歧义,使你的代码达不到想要的效果。C#为了避免这个问题和C#的严谨,所以在编译时作为错误处理。
“属性”的get访问器也是要调用return的,所以属性也有这个限制。
索引和数组不同的地方在于,索引器并没有直接对应引用数据存储的地方,而数组则有。
索引器有get访问器与set访问器,用来指明要读取或写入索引器元素时,需要执行的代码。
list的[]操作实际上是索引器,所以s1[0]是执行return的,所以也有这个问题。
数组是直接取数据,所以没有这个问题。




list将Item属性实现为[]操作,所以a[i]是执行return的,t.Student通过属性访问显然也是执行return的,STRUCT是值类型的,当用下标操作返回时,是值拷贝操作。就是将a[i]中的struct赋给临时变量,而这个赋值过程是值拷贝,值拷贝是内存复制,所以当赋值"jhon"时,只更改临时变量,而不会改变LIST中的元素所指向的内存。如果确实需要这样能直接赋值,需要使用class,这样就都是引用了,不存在因为值拷贝而引发“不是变量”的问题。
贝贝壳壳 2012-03-31
  • 打赏
  • 举报
回复

StructTest st = poList[i];
st.Str1 = "BB";
st.Str2 = "BB";
bdmh 2012-03-31
  • 打赏
  • 举报
回复
内容概要:本文系统研究了Picard迭代法在非线性常微分方程参数估计中的应用,深入阐述了该方法的数学原理及其在参数辨识中的收敛性与稳定性优势。通过构建最小化误差的目标函数,并结合数值积分技术,采用迭代方式逐步逼近系统的真实参数值,有效解决了非线性动态系统中因缺乏解析解而难以进行精确建模的问题。文中提供了完整的Matlab代码实现,涵盖模型定义、迭代求解、参数更新与结果可视化等关键环节,增强了方法的可操作性与工程实用性。研究通过典型非线性系统案例验证了算法的有效性,展示了其在科学计算与工程建模中的良好适应性与推广潜力。; 适合人群:具备常微分方程理论、数值分析基础及Matlab编程能力,从事系统建模、参数辨识、动力学仿真等相关方向的研究生、科研人员和工程技术开发者。; 使用场景及目标:①解决实际工程中非线性微分方程模型的未知参数估计问题;②深入理解Picard迭代法在科学计算中的实现机制与数值特性;③为学术论文复现、科研项目开发或课程设计提供可运行、易调试的技术方案与代码参考。; 阅读建议:建议读者结合文中的数学推导与Matlab代码逐行分析,重点关注迭代流程、目标函数构造与数值积分的耦合实现,通过修改模型结构或噪声条件进行扩展实验,以深化对算法鲁棒性与适用边界的理解。配套资源可通过指定公众号和网盘链接获取,推荐同步学习以加速科研进程。

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧