对C#struct如何工作感到困惑

时间:2015-06-19 02:30:00

标签: c# struct

我有一个结构

public struct card
{
    PictureBox picture;
    double value;
}

我想制作一个数组,并在我继续时添加/删除图片和值。我无法做到这一点

card[] c = new card[13];
c[1].value = 4; 

如何分配,阅读和机会值?

3 个答案:

答案 0 :(得分:6)

制作value public

public double value;

By default,类/结构级元素为private,这使得它无法访问。

建议大写公共元素,并使用properties而不是字段,因此使用以下内容会更好:

public double Value { get; set; }

您可能需要考虑将struct设为class,因为这不太合适。 (请参阅When to use struct?,大部分时间您将使用C#中的课程)您还可以使用图片及其值的字典:

public Dictionary<Picture, double> Cards;

答案 1 :(得分:0)

C#中的结构不等同于C结构。在C#中,struct具有 by value 复制语义。这可能有点令人困惑。

请考虑以下事项:

import QtQuick 2.3
import QtQuick.Window 2.2

Window {
    visible: true
    width: 200
    height: 200

    Rectangle {
        width: 100
        height: 100
        anchors.centerIn: parent
        color: "red"

        transform: [
            Rotation { origin.x: 30; origin.y: 30; axis { x: 0; y: 1; z: 0 } angle: 24 },
            Rotation { origin.x: 30; origin.y: 30; axis { x: 1; y: 0; z: 0 } angle: 60 }
        ]
    }
}

您可能希望Card[] cards = new Card[13]; Card card = cards[1]; card.Value = 42; 为42,但当您发现它不是时,您会感到惊讶。这部分是transform

的原因

改为使用cards[1].Value,它与传递类的引用副本的方式更接近C结构,而不是复制值本身:

class

答案 2 :(得分:0)

结构是一堆与胶带粘在一起的变量。如果你想要一堆与管道胶带粘在一起的独立但相关的变量,通常最好使用一个结构来暴露与管道胶带粘在一起的一堆变量,而不是设计一个试图达到这个目的的类,或者假装成为试图服务于该目的的类的对象的结构。但是,如果你想要一些表现为对象的东西,那么你应该使用一个类。

如图所示定义cardcard[] foo = new card[10]foo识别一个数组,其中包含10个PictureBox类型的引用和10个double值。声明card bar;将为另一个PictureBox引用和另一个double定义空间,这些空间与Universe中的任何其他内容无关。说bar = foo[3];等同于bar.picture = foo[3].picture; bar.value = foo[3].value;,并且不会在barfoo[3]的字段之间建立任何持久的关系。

管道录制变量结构对于某些目的非常有用,例如保持点的坐标,但重要的是要识别它们的位置。如果希望类型表示对象,请使用类。只有当您希望它将一堆独立但相关的变量用管道连接在一起时才应使用struct