在本教程中,我们将继续学习我们在上一集创建的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**事实上是相等的。事实上,它们是相等的,因为我们的测试在运行时通过了。

测试无效的数据
上面的代码测试的是有效数据。那么无效的数据呢?考虑到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);
}
专业提示:要想只运行一个测试而不是整个套件,你可以右键单击要运行的测试方法的名称,然后选择 "运行选定的测试"。

我们可以再添加一个无效数据的测试方法。这一次,我们将检查一个丢失的电子邮件地址。这里是测试方法,我们称之为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);
}
为了谨慎起见,我们现在运行所有的测试。看起来所有的测试都通过了,所以这很好!

添加一个构造函数
我们的客户类需要一个构造函数,所以我们现在可以解决这个问题。构造函数是一段特殊的代码,在一个类的实例被创建时被执行。换句话说,每次从一个类中创建一个对象时,类的构造函数就会被运行。它的名字与类本身的名字相同。构造函数应该被放在类的顶部,高于任何属性和方法。创建构造函数的一种方法是使用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。

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

如何在C#中为一个类添加方法 摘要
在本教程中,我们看了如何向客户类添加方法。我们学习了一些关于方法签名、方法重载以及构造函数的使用方法。

一个方法的签名是其名称和参数集。它不包括返回类型。C#编译器使用方法签名来匹配调用代码和正确的方法。当有一个以上的方法具有相同的名称时,我们称之为重载。

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

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