【问题标题】:C# Accessor auto-property not sufficient for FillPolygon()C# 访问器自动属性对于 FillPolygon() 来说是不够的
【发布时间】:2018-01-13 13:54:29
【问题描述】:

我正在创建一个简单的用户控件。我有 4 个点,正在尝试使用 e.Graphics.FillPolygon(brush, shape); 填充点的区域

shape 是使用Point[] shape = { Target, PointB, PointC, PointD }; 创建的

这些观点来自以下几点:

    Point target = new Point(0, 0);
    public Point Target {
        get { return target; }
        set { target = value; }
    }

    Point pointB = new Point(100, 0);
    public Point PointB { get; set; }
    //    get { return pointB; }
    //    set { pointB = value; }
    //}


    Point pointC = new Point(0, 100);
    public Point PointC {
        get { return pointC; }
        set { pointC = value; }
    }


    Point pointD = new Point(200, 500);
    public Point PointD {
        get { return pointD; }
        set { pointD = value; }
    }

我的问题是使用public Point PointB { get; set; }似乎不起作用,所以我不得不写出整个get { return pointB; } set { pointB = value; }

速记符号有什么特别之处吗?

使用{ get; set; }

使用更长的(正确的?)符号:

在使用速记符号时,它似乎只是忽略了PointB



另外,在访问器位之前或之后有Point target = new Point(0, 0); 是否合适:

Point target = new Point(0, 0);
public Point Target {
    get { return target; }
    set { target = value; }
}

public Point Target {
    get { return target; }
    set { target = value; }
}
Point target = new Point(0, 0);

【问题讨论】:

    标签: c# user-controls accessor shorthand


    【解决方案1】:

    初始化应如下所示(较新的 C# 版本,C# 6.0 或更高版本):

    public Point PointB { get; set; } = new Point(100, 0);
    

    当你这样做时:

    Point pointB = new Point(100, 0);     // Never used, not a backing field.
    public Point PointB { get; set; }     // Has a backing field that you cannot refer to.
    

    从未使用私人pointB。自动属性的支持字段称为pointB。它有一个无法使用的名称,如果不使用该属性,您永远无法访问它。

    【讨论】:

    • 我的方法有没有正确的时候?我最近开始学习 C#,发现其他人的项目使用了我所拥有的,这就是我一直在使用它的原因。另外,这是否意味着根本没有pointB,只有PointB?这个问题的符号相同:stackoverflow.com/questions/1310223/…
    • 不,你的方式从来都不是正确的。当你有一个自动属性 ​​public Point PointB { get; set; } 时,确实存在一个支持字段,但它的真实名称是奇怪的和不可预测的,并且由 C# 编译器选择,即使你碰巧知道它是什么,也不允许引用给它。在您提到的线程中,Bryan Watts 的回答有 Jon Skeet 的评论:...虽然该字段的名称实际上是一个“无法形容”的名称(例如<>__name),它是无效的一个 C# 标识符。这会阻止您直接从代码中访问该字段。
    • 好的,所以我在尝试在同一个 UserControl.cs 中使用访问器时遇到了困难。我觉得这是不正确的做法,但我在课堂上的顶部有public PointF PointB { get; set; }。然后我有更进一步的方法,我可以像public void PointConstructor() { PointB = new PointF(0, 0); triangle[1] = PointB; }那样实际使用它
    • @Tawm 代码必须进入方法或构造函数等,它不能在class 级别“浮动”。当有返回类型时,例如您在此处评论中的void,它是一种方法。当没有返回类型并且名称与类的名称相同时,您有一个构造函数,如 public Form2() { PointB = new PointF(0, 0); triangle[1] = PointB; } 内的 class 称为 Form2
    猜你喜欢
    • 1970-01-01
    • 2021-07-03
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 2016-05-10
    • 1970-01-01
    相关资源
    最近更新 更多