使用时生成
通过“使用时生成”功能可以直接使用类和成员,而不必提前定义它们。可以为要使用但尚未定义的任何类、构造函数、方法、属性、字段或枚举生成存根。可以生成新类型和成员,而无须离开代码中的当前位置。这可以尽可能少地中断工作流。
“使用时生成”支持如测试先行的开发之类的编程模式。
在 C# 中使用“使用时生成”
每个未定义标识符下都显示一条波浪下划线。将鼠标指针置于标识符上时,工具提示中将显示错误消息。
若要显示适当的选项,可以使用以下过程之一:
单击未定义标识符。最左侧的字符下会显示一条短下划线。将鼠标指针置于该短下划线上,会显示一个智能标记(图标)。单击该智能标记。
单击未定义标识符,然后按 Ctrl+.(句点)。
右击未定义标识符,然后单击**“生成”**。
出现的选项可能包括以下这些:
生成属性存根
生成字段存根[Generate field stub]
生成方法存根
生成类
生成新类型(针对类、结构、接口或枚举)
在 Visual Basic 中使用“使用时生成”
每个未定义标识符下都显示一条波浪下划线,且最右侧的字符下将显示一条短下划线。将鼠标指针置于标识符上时,工具提示中将显示错误消息。
若要显示适当的选项,可以使用以下过程之一:
将鼠标指针置于在未定义标识符上。此时会显示一个智能标记(图标)。单击该智能标记。
单击未定义标识符,然后按 Ctrl+.(句点)。
在**“错误列表”**窗口中,双击相应的错误行。
出现的选项可能包括以下这些:
生成属性存根
生成字段存根[Generate field stub]
生成方法存根
生成类
生成接口
生成新类型(针对类、结构、接口、枚举、委托或模块)
生成属性存根
如果代码引用未定义的属性,请单击**“生成属性存根”**。将在相应的类中生成属性存根。属性的返回类型由上下文决定。
例如,假设您从以下代码中的语句生成 InstanceProperty 属性。
Dim cust As New Customer()
Dim city As String = cust.InstanceProperty
Customer cust = new Customer();
string city = cust.InstanceProperty;
生成属性时,将在 Customer 类中创建以下存根。
Property InstanceProperty() As String
public string InstanceProperty { get; set; }
如果在类型而不是实例上调用某个属性,则生成的存根将为静态属性 (C#) 或共享属性 (Visual Basic)。
例如,假定您从以下语句生成属性(假设 Customer 为类名)。
Dim description As String = Customer.SharedProperty
string description = Customer.StaticProperty;
生成属性时,将在 Customer 类中创建以下存根。
Shared Property SharedProperty As String
public static string StaticProperty { get; set; }
如果调用某个属性而不进行限定(引用当前类型的成员),且从静态方法调用该属性,则生成的存根为静态属性。否则,将为实例属性。
例如,假设您从以下语句生成属性。
Dim title As String = UnqualifiedProperty
string title = UnqualifiedProperty;
生成属性时,将在当前类中创建以下存根。
Private Property UnqualifiedProperty() As String
public string UnqualifiedProperty { get; set; }
生成方法存根
如果代码引用未定义的方法,请单击**“生成方法存根”**。将在相应的类中生成方法存根。
每个参数的类型以及返回类型由上下文决定。如果无法推断类型(例如在匿名类型中或隐式类型的局部变量中,这种局部变量为使用 var 关键字定义的变量),将使用对象类型。
各个形参的名称从传递给方法调用的实参名派生。
例如,假设您从以下代码中的语句生成 InstanceMethod 方法。
Dim cust As New Customer()
Dim itemNumber = 3
Dim itemName = "abc"
cust.InstanceMethod(itemNumber, itemName, 4)
Customer cust = new Customer();
int itemNumber = 3;
string itemName = "abc";
cust.InstanceMethod(itemNumber, itemName, 4);
生成方法时,将在相应的类中创建以下存根。
Sub InstanceMethod(ByVal itemNumber As Integer, ByVal itemName As String, ByVal p3 As Integer)
Throw New NotImplementedException
End Sub
internal void InstanceMethod(int itemNumber, string itemName, int p)
{
throw new NotImplementedException();
}
如果在类型而不是实例上调用某个方法,则生成的存根将为静态方法 (C#) 或共享方法 (Visual Basic)。
为事件生成方法存根
在 Visual Basic 中,可以为在 AddHandler 语句或 RemoveHandler 语句中引用的事件生成事件处理程序方法。
例如,假设您从代码中的以下任一语句生成 EventHandler 方法。
AddHandler obj.Ev_Event, AddressOf EventHandler
RemoveHandler obj.Ev_Event, AddressOf EventHandler
生成方法时,将在当前类中创建以下存根。
Private Sub EventHandler()
Throw New NotImplementedException
End Sub
生成构造函数存根
如果代码引用未定义的构造函数,请单击**“生成构造函数存根”**。将在相应的类中生成构造函数存根。每个参数的类型由上下文决定。
将检查构造函数的参数名称。如果类具有的属性的名称与这些形参的名称匹配,将在构造函数中提供代码以存储这些属性的实参值。
例如,假设您从以下代码中的语句生成 Example 类的构造函数。
Dim total As Long = 12
Dim exampleTest As New Example(5, total, Date.Now)
long total = 12;
Example exampleTest = new Example(5, total, System.DateTime.Now);
生成构造函数时,将在 Example 类中创建以下私有变量(如果这些变量尚不存在)。
Private _p1 As Integer
Private _total As Long
Private _p3 As Date
private int p;
private long total;
private DateTime dateTime;
将创建以下构造函数存根。
Sub New(ByVal p1 As Integer, ByVal total As Long, ByVal p3 As Date)
' TODO: Complete member initialization
_p1 = p1
_total = total
_p3 = p3
End Sub
public Example(int p, long total, DateTime dateTime)
{
// TODO: Complete member initialization
this.p = p;
this.total = total;
this.dateTime = dateTime;
}
可以在一个类中生成多个构造函数。如果构造函数调用具有不同的参数数目或参数类型,则可以生成附加构造函数。
在 Visual Basic 中,生成类时也将生成构造函数。有关更多信息,请参见本主题中的下一节。
生成类
如果代码引用未定义的类或其他类型,则会出现针对**“生成类”和“生成新类型”**的选择。
如果单击**“生成类”**,将在项目的新文件中生成一个空的类存根。新文件将在代码编辑器中打开(但没有获得焦点)。这是在当前项目的新文件中创建具有默认访问修饰符的新类类型的最快捷的方法。
例如,假设您从以下语句生成类。
Dim cust As Customer
Customer cust;
生成类时,将在项目的新文件中创建以下新类存根。
Class Customer
End Class
namespace CSharpWindowsApp
{
class Customer
{
}
}
如果类定义中未定义继承的基类,也可以使用**“生成类”**命令。
生成类和构造函数
在 Visual Basic 中,生成的类将包括构造函数(如果适用)。
例如,假设您从以下语句生成类。
Dim total = 3
Dim exampleTest As New Example(5, total, Date.Now) With {.Description = "book"}
生成类时,将在项目的新文件中创建以下新类存根。将在类中生成构造函数。将为以上代码中的 With 子句中的对象初始值创建 Description 属性。
Class Example
Private _p3 As Date
Private _total As Integer
Private _p1 As Integer
Sub New(ByVal p1 As Integer, ByVal total As Integer, ByVal p3 As Date)
' TODO: Complete member initialization
_p1 = p1
_total = total
_p3 = p3
End Sub
Property Description As String
End Class
生成新类型和附加选项
如果代码引用未定义的类、接口、枚举、结构 (C#) 或结构 (Visual Basic),则会出现针对**“生成类”和“生成新类型”**的选择。下图对此进行了演示。
Visual Basic
Visual C#
单击**“生成新类型”打开“生成新类型”**对话框,您可在该对话框中选择访问级别、类型种类、项目位置和文件名。
**“生成新类型”**选项在生成类时可提供额外的灵活性。您可能更愿意将类放在现有文件中,或指定访问修饰符,或者将新文件添加到解决方案中的其他项目。
下图显示了**“生成新类型”**对话框。
“生成新类型”对话框
下表显示了**“生成新类型”**对话框中的可用选项。
选项 |
C# 选项 |
Visual Basic 选项 |
---|---|---|
访问 |
默认、公共、内部或私有。 |
默认、友元或公共。 |
Kind |
类、结构、接口或枚举。 |
类、结构、接口、枚举、委托或模块。 |
项目位置 |
当前项目或解决方案中的其他项目。 |
当前项目或解决方案中的其他项目。 |
文件名 |
“使用文件名创建新文件”或“添加到同名的现有文件”。 |
“使用文件名创建新文件”或“添加到同名的现有文件”。 |
如果在新文件中生成类型,则该新文件将包含由**“添加新项”**对话框生成的类的一组默认 using 指令。
如果在解决方案的其他项目中生成类型,则会将引用该项目的 using 指令添加到当前文件中。
生成接口存根
若要从未定义的接口生成代码,请单击**“生成新类型”。会打开“生成新类型”对话框。在“种类”列表中,单击“接口”。在 Visual Basic 中,还可以单击“生成接口”**。
例如,假设您从以下代码中的语句生成 IAuto 接口。
Public Class Sedan : Implements IAuto
End Class
public class Sedan : IAuto
{
}
生成接口时,将创建以下存根。
Interface IAuto
End Interface
interface IAuto
{
}
生成委托存根
若要在 Visual Basic 中从未定义的委托生成代码,请单击**“生成新类型”。会打开“生成新类型”对话框。在“种类”列表中,单击“委托”**。
例如,假设您从以下代码中的语句生成 MathOperator 委托。
Dim delInstance As New MathOperator(AddressOf AddNumbers)
生成委托时,将创建以下存根。
Delegate Sub MathOperator()
IntelliSense 建议模式
IntelliSense 为语句完成功能提供两种选项:“完成模式”和“建议模式”。对于在定义类和成员之前便要使用它们的情况,使用建议模式。
在 IntelliSense 建议模式下,当在代码编辑器中键入并提交项时,键入的文本会插入到代码中。如果在 IntelliSense 完成模式下下提交某个项,则在成员列表中选择的项会插入到代码中。
当 IntelliSense 窗口打开时,可以按 Ctrl+Alt+空格键在完成模式和建议模式之间切换。
有关更多信息,请参见使用 IntelliSense。