这段代码在c#中是做什么的,它的目的是什么?

本文关键字:什么 是什么 段代码 代码 | 更新日期: 2023-09-27 18:03:09

 public class A {
    public Par mParams;
    public Par Parameters {
        get { return mParams; }
        set { mParams = value; }
    }
}

我是c#新手

public Par Parameters是什么?这看起来既不是类也不是函数。困惑。

这段代码在c#中是做什么的,它的目的是什么?

把它想象成Java中的public Par getParameters()public void setX(Par p)方法。所以,它是最接近"函数",但它实际上被称为属性。你可以这样使用:

A myObject = new A();
a.Parameters = new Par(...);

这是一个由公共字段支持的属性,在这种情况下,它有些多余,应该将mParms声明为protectedprivate

我建议您查看此MSDN属性编程指南。它很好地解释了它们是如何工作的以及它们的用途。

Public Par Parameters的代码块是一个属性

我怀疑public Par mParams;行实际上应该是私有的。它是存储属性值的底层变量。

值得指出的是,在c#中不再显式地需要mParams。您可以定义一个自动属性,其中编译器使用

创建它自己的底层私有变量:
Public Par Parameters { get; set; }

public Par Parameters是一个属性,用于设置或获取mParams的值。

Parameters是类型为Par的属性。它有一个访问修饰符(public),这意味着它可以从代码中的任何地方访问。

您的示例有点多余,因为mParams字段实际上是可公开访问的,并且公开它的属性除了返回和设置字段之外没有做任何事情。但是,您可能会在每个"访问器"(get和set位)中添加额外的代码。例如,执行验证,通知某些属性已更改等。

属性的使用方式与字段的使用方式大致相同:

A foo = new A();
// Calls the "get" accessor of the Parameters property
if (foo.Parameters == null)
{
    // Calls the "set" accessor of the Parameters property
    foo.Parameters = new Par();
}

不允许从类外部直接访问成员字段(变量)被认为是最佳实践。因此,在典型的场景中,该字段应该是私有的(或者有时是受保护的):

private Par mParams;
public Par Parameters
{
    get { return mParams; }
    set { mParams = value; }
}

还需要学习一些略有不同的语法。首先是自动实现的属性:

public Par Parameters
{
    get;
    set;
}

对于自动实现的属性,c#编译器会自动为你生成一个支持字段。如果我们的属性getter和setter不需要包含任何逻辑,这将节省您编写一些代码。

您还可以使用属性来限制访问,这是使用字段无法实现的:

public Par Parameters
{
    get;
    private set;
}

注意set "accessor"有它自己的访问修饰符。结果是一个公开可读的属性,但只允许类本身设置它。这类似于:

private Par mParams;
public Par Parameters
{
    get { return mParams; }
}

可以有效地做同样的事情,但是没有自动实现的属性。

在不支持属性的语言中,所有这些都可以通过创建两个方法来实现:GetParametersSetParameters。事实上,c#编译器会在后台生成一些非常相似的命名方法。

这是存取器和变异器的简写。在另一个例子中:

private int i = 0;
public int myNumber {
    get { return i; }
    set { i = value; }
}

允许您更改变量i。如下代码所示:

className.myNumber = 20;
// className.i is now 20

这是一个属性,它的工作方式非常像一对方法(函数),其唯一目的是让您访问mParams字段。作为语法糖,c#为您提供了对它进行赋值和读取的能力,就像对变量一样。可以把它看作两个方法,getParameterssetParameters不能直接调用,但是在访问Parameters时调用它们。

Parameters = new Par(); //Works as though you had run: setParameters(new Par());
Par x = Parameters;     //Works as though you had run: Par x = getParameters();

这允许你使用更短、更方便、更有表现力的类似变量的语法,但你实际上在做的是运行编译器创建的两个"不可见"的方法。