相关疑难解决方法(0)


直接修改List <T>元素

我有这个结构:

struct Map
{
    public int Size;

    public Map ( int size )
    {
        this.Size = size;
    }

    public override string ToString ( )
    {
        return String.Format ( "Size: {0}", this.Size );
    }
}
Run Code Online (Sandbox Code Playgroud)

使用数组时,它可以工作:

Map [ ] arr = new Map [ 4 ] {
    new Map(10),
    new Map(20),
    new Map(30),
    new Map(40)};

arr [ 2 ].Size = 0;
Run Code Online (Sandbox Code Playgroud)

但是当使用List时,它不会编译:

List<Map> list = new List<Map> ( ) {
    new Map(10),
    new Map(20),
    new Map(30),
    new Map(40)};

list [ 2 …
Run Code Online (Sandbox Code Playgroud)

.net c#

33
推荐指数
2
解决办法
5万
查看次数

结构的不变性

可能重复:
为什么可变结构是邪恶的?

我在很多地方阅读它,包括在这里最好将结构化为不可变的.

这背后的原因是什么?我看到许多微软创建的结构是可变的,就像xna中那样.可能在BCL还有更多.

不遵守本指南的利弊是什么?

.net c# struct immutability

30
推荐指数
6
解决办法
1万
查看次数

无法修改表达式,因为它不是变量

我试图在Windows窗体上获取一个UserControl(其上有一个网格)来调整大小.以下代码是我在表单中的内容.我得到的行为是,当我把它变大时,控件会被调整大小.但它并没有缩小.我做错了什么(或)我错过了什么?

private void AdjustGrid()
{
    ZoomControl.Location = new Point(5, 5);
    ZoomControl.Size = new Size(this.Width - 15, this.Height - 75);
}

void zoomform_Resize(object sender, EventArgs e)
{
    AdjustGrid();
}
Run Code Online (Sandbox Code Playgroud)

现在用户控件具有以下代码:

//Resize the grid that the UserControl has on it
private void NameValuePropertyBag_Resize(object sender, EventArgs e)
{
    grdNameValueProperties.Location = new Point(4,4);
    grdNameValueProperties.Size = new Size(this.Width - 8, this.Height - 8);
}
Run Code Online (Sandbox Code Playgroud)

我试过了

grdNameValueProperties.Size.Width = this.Width - 8;
grdNameValueProperties.Size.Height = this.Height -8;
Run Code Online (Sandbox Code Playgroud)

它给了我"无法修改表达式,因为它不是变量"错误...我错过了什么?

附加信息:

我正在使用SetParent()Windows调用将UserControl移动/缩放到另一个窗体(ZoomForm). Anchor似乎不适用于使用SetParent()移动的控件...更确切地说,它可能正在工作,但我重新绘制了问题.

我让Anchor/Dock对工作没有重新绘制问题[我删除了调整大小事件连线并调整了Dock to Fill]

ZoomForm最初没有控件.Usercontrol动态添加到ParentForm.

目前,我可以使用上面的代码使缩放形式更大 …

c# user-controls winforms

6
推荐指数
2
解决办法
2万
查看次数

为什么struct可以改变自己的领域?

考虑Foo结构如下:

struct Foo
{
  public float X;
  public float Y;

  public Foo(float x, float y)
  {
    this.X = x;
    this.Y = y;
  }

  public void Change(float x)
  {
    this.X = x;
  }
}
Run Code Online (Sandbox Code Playgroud)

我理解修改构造函数中的字段,这对我和我理解结构作为值,类似数字的不可变类型是完全合乎逻辑的.

然而,因为可以T"做:

Foo bar = new Foo(1, 2);
bar.X = 5;
Run Code Online (Sandbox Code Playgroud)

为什么可以使用:

Foo bar = new Foo(1, 2);
bar.Change(5);
Run Code Online (Sandbox Code Playgroud)

编辑:如果结构是可变的,那么为什么它们不能在列表中修改或从属性返回?

无法修改表达式,因为它不是变量

c# struct

5
推荐指数
2
解决办法
5657
查看次数

标签 统计

c# ×5

struct ×3

.net ×2

const ×1

immutability ×1

stack ×1

user-controls ×1

winforms ×1