如何在C语言中中为类添加方法

137 阅读7分钟

在本教程中,我们将继续学习我们在上一集创建的Customer类。现在我们要继续学习C#中面向对象的基础知识,为此我们将开始研究方法。我们的客户类将需要一些方法,如Validate()、Retrieve()和Save(),以使其更有用。属性只能保存数据,但如果我们希望这个类能够进行工作,我们就需要添加这些方法。我们还将重温C#和面向对象编程中构造函数的概念。


添加一个方法

我们可以创建的第一个方法是Validate()方法。在C#中,你可以使用函数语法来创建一个方法。我们将使用public关键字,这样它就可以从应用程序的其他部分访问。这个方法将返回真或假。这就是我们所说的布尔值。因此,我们需要将这个方法打成这样。所以在public关键字之后,我们必须使用bool关键字。在bool关键字之后是我们选择的方法的名称,我们将称它为Validate()。在该方法的主体中,有一些逻辑来验证LastName和EmailAddress的属性值。这段代码在我们的crm客户类中强调如下。
Customer.cs

using System;

namespace CRMBIZ
{
    public class Customer
    {
        public static int InstanceCount { get; set; }
        private string _lastName;
        public string LastName
        {
            get
            {
                return _lastName;
            }
            set
            {
                _lastName = value;
            }
        }

        public string FirstName { get; set; }

        public string EmailAddress { get; set; }

        public int CustomerId { get; private set; }

        public string FullName
        {
            get
            {
                string fullName = LastName;
                if (!string.IsNullOrWhiteSpace(FirstName))
                {
                    if (!string.IsNullOrWhiteSpace(fullName))
                    {
                        fullName += ", ";
                    }
                    fullName += FirstName;
                }
                return fullName;
            }
        }

        public bool Validate()
        {
            var isValid = true;

            if (string.IsNullOrWhiteSpace(LastName)) isValid = false;
            if (string.IsNullOrWhiteSpace(EmailAddress)) isValid = false;

            return isValid;
        }
    }
}

测试一个新方法

我们已经为我们的Customer类设置了一个测试类,名为CustomerTest。让我们重新审视这个测试类,并添加一个新的测试方法来确认我们的Validate()方法是否有效。为了简洁起见,我们将只展示测试方法,而不是整个测试类文件。当创建自动化代码测试时,有一个有效值的测试和一个无效值的测试是有意义的。下面的第一个测试是测试该方法的有效值。注释中给出了一个如何遵循测试过程的想法。换句话说,设置一些数据,使用你要测试的代码采取一个行动,然后断言结果。

[TestMethod]
public void ValidateValid()
{
    // Set up the data
    var customer = new Customer();
    customer.LastName = "Smith";
    customer.EmailAddress = "Hsmith@greenenergy.com";

    var expected = true;

    // Take an action
    var actual = customer.Validate();

    // Assert the results
    Assert.AreEqual(expected, actual);
}

在上面的测试代码中,我们首先创建一个新的客户,然后填入LastName属性和EmailAddress属性。这两个属性是需要在我们原来的Validate()方法中填写的。因此,既然如此,我们期望在这种情况下返回真。我们用*var expected = true;*语法来说明这一点。然后,我们从客户对象上调用Validate()方法,并将返回值存储在 **actual**变量中。最后,我们使用Assert.AreEqual()方法来确认 **expected**和 **actual**事实上是相等的。事实上,它们是相等的,因为我们的测试在运行时通过了。
validate test method C# passing


测试无效的数据

上面的代码测试的是有效数据。那么无效的数据呢?考虑到LastName数据缺失,那怎么办?下面的代码告诉我们如何做到这一点。注意,这次我们在设置数据的时候,没有填充LastName字段。这是错误的,所以我们预计在这种情况下,Validate()方法会返回false。因此,该 **expected**变量被设置为false。当Validate()被调用时,它应该返回false并将其存储在 actual.现在。 **expected**是假的,而 **actual**应该是假的,所以Assert.AreEqual()应该是真。

[TestMethod]
public void ValidateMissingLastName()
{
    // Set up the data
    var customer = new Customer();
    customer.EmailAddress = "Hsmith@greenenergy.com";

    var expected = false;

    // Take an action
    var actual = customer.Validate();

    // Assert the results
    Assert.AreEqual(expected, actual);
}

专业提示:要想只运行一个测试而不是整个套件,你可以右键单击要运行的测试方法的名称,然后选择 "运行选定的测试"。
right click run selected tests

我们可以再添加一个无效数据的测试方法。这一次,我们将检查一个丢失的电子邮件地址。这里是测试方法,我们称之为ValidateMissingEmailAddress()。

[TestMethod]
public void ValidateMissingEmailAddress()
{
    // Set up the data
    var customer = new Customer();
    customer.LastName = "Smith";

    var expected = false;

    // Take an action
    var actual = customer.Validate();

    // Assert the results
    Assert.AreEqual(expected, actual);
}

为了谨慎起见,我们现在运行所有的测试。看起来所有的测试都通过了,所以这很好!
all method tests pass


添加一个构造函数

我们的客户类需要一个构造函数,所以我们现在可以解决这个问题。构造函数是一段特殊的代码,在一个类的实例被创建时被执行。换句话说,每次从一个类中创建一个对象时,类的构造函数就会被运行。它的名字与类本身的名字相同。构造函数应该被放在类的顶部,高于任何属性和方法。创建构造函数的一种方法是使用Visual Studio的片段。通过输入 ctor,然后 tab,再 tab,你会看到构造函数被自动创建。

如果一个构造函数没有参数,它就被称为默认构造函数。我们的客户类中的所有属性已经默认为合理的值,因此我们不需要在构造函数中初始化任何东西。如果需要的话,也可以添加额外的带参数的构造函数。这里有一个有趣的问题。如果你不需要在构造函数中实际运行任何代码,那么在技术上你就不需要它。C#会在后台自动为你运行它。让我们添加另一个构造函数,它将初始化一些数据。这里是我们的客户类,有我们刚刚创建的两个新构造函数。

using System;

namespace CRMBIZ
{
    public class Customer
    {
        public Customer()
        {

        }

        public Customer(int customerId)
        {
            this.CustomerId = customerId;
        }

        public static int InstanceCount { get; set; }
        private string _lastName;
        public string LastName
        {
            get
            {
                return _lastName;
            }
            set
            {
                _lastName = value;
            }
        }

        public string FirstName { get; set; }

        public string EmailAddress { get; set; }

        public int CustomerId { get; private set; }

        public string FullName
        {
            get
            {
                string fullName = LastName;
                if (!string.IsNullOrWhiteSpace(FirstName))
                {
                    if (!string.IsNullOrWhiteSpace(fullName))
                    {
                        fullName += ", ";
                    }
                    fullName += FirstName;
                }
                return fullName;
            }
        }

        public bool Validate()
        {
            var isValid = true;

            if (string.IsNullOrWhiteSpace(LastName)) isValid = false;
            if (string.IsNullOrWhiteSpace(EmailAddress)) isValid = false;

            return isValid;
        }

        public bool Save()
        {
            return true;
        }
    }
}

注意,在第二个构造函数中使用了 this关键字在第二个构造函数中的使用。这意味着它正在引用类的当前实例。想象一下,你创建了一个新的客户,并将其分配给一个类似c1的变量。当构造函数在初始化c1的过程中被调用时,这个 this关键字是指 c1。
how C# this keyword works

如果有人来创建一个不同的客户实例,并将该客户放在c2中,那么这个关键字将指向该新实例。
how C# this keyword works example


如何在C#中为一个类添加方法 摘要

在本教程中,我们看了如何向客户类添加方法。我们学习了一些关于方法签名、方法重载以及构造函数的使用方法。
C# Method Signature
一个方法的签名是其名称和参数集。它不包括返回类型。C#编译器使用方法签名来匹配调用代码和正确的方法。当有一个以上的方法具有相同的名称时,我们称之为重载。


C# method overloading
重载是指两个或多个方法具有相同的名称,但参数不同。可以有不同数量的参数,不同类型的参数,或者不同数量参数和不同类型参数的组合。上面的代码显示一个方法接受一个整数参数,另一个方法不接受参数。


C# default constructor
构造函数是类中的一段代码,它在类的一个实例被实例化为一个对象时执行。惯例是将构造函数设置为类的一个公共方法,使用与类本身完全相同的名称。默认的构造函数是一个不需要参数的构造函数。除非你需要初始化一些值或传递一些参数给类,否则你不需要特别包含一个构造函数。