变量C#的加法赋值

时间:2018-09-04 14:54:54

标签: c#

如何在只能使用附加分配设置的类中创建属性。我知道事件在C#中以这种方式工作。我想知道如何在自己的代码中实现该构造。

例如。对于活动,我可以执行以下操作

public event EventHandler myEventHandler;
myEventHandler += NewEvent;

这会将NewEvent添加到调用myEventHandler时运行的事件链中。

我希望能够做类似的事情。我想创建一个Graph类,该类为带有节点和连接的数学图建模。 Graph类将具有nodes属性,该属性只能添加或删除节点,而不能设置为整个属性。

再次使用EventHandler示例,我将无法对EventHandler进行以下操作

myEventHandler = OnlyOneEventWillRun;

我还希望能够对附加分配实现类似于set{}访问器的逻辑。

2 个答案:

答案 0 :(得分:2)

对于初学者来说,Sub GetOtherWorkbook() Dim wbWithMacro As Workbook Dim wbOther As Workbook, wb As Workbook Set wbWithMacro = Me.Parent 'Assumes macro is in a "Sheet" code container 'Set wbWithMacro = Me 'Assumes macro is in "ThisWorkbook" code container For Each wb In Workbooks If Not wb Is Me Then Set wbOther = wb Exit For End If Next Debug.Print wbWithMacro.Name, wbOther.Name End Sub 是一个多播委托-您可以自己镜像该功能,但这并不能真正解决您所说的问题。

我将采用的方法是使用私有设置器(或根本不使用任何设置器)-这将允许您从定义属性的类中设置值(大概您会知道并记住您在做什么) ),但不是来自课堂之外(其他开发人员可能不经意间将其搞砸了):

myEventHandler

答案 1 :(得分:1)

  

Graph类将具有一个节点属性,该属性只能   可以添加或删除节点,但不能将其设置为整体属性。

虽然这对于封装非常有用,但实现它的方法比重载+=运算符的方法更简单,更明显。

这里是一个例子:

class Graph
{
    private List<Node> nodes;
    public ReadOnlyCollection<Node> Nodes
    {
        get { return new ReadOnlyCollection<Node>(nodes); }
        //note no setter
    }

    public void AddNode(Node node) 
    { 
        //whatever additional logic you need
        nodes.Add(node); 
    }
}

如果您想使您的API更流畅,可以将Graph对象本身作为AddNode的返回值,因此可以将其与链接添加一起使用:

graph.AddNode(node1)
    .AddNode(node2)
    .AddNode(node3);

和/或接受节点的params数组参数,以便可以将其称为:

graph.AddNode(node1, node2);
graph.AddNode(node3);