VB中的属性

时间:2013-07-25 13:42:35

标签: properties vb6

以下是用VB .cls文件编写的代码片段:

Public Property Get Request() As String
    Request = m_sRequest
End Property
Public Property Let Request(sData As String)
    m_sRequest = sData
    ParseRequest sData
End Property

在另一个班级中使用以下一行:

Public Sub LogError(Request As RequestParameters, ByVal sData As String, ibErr As CibErr)

Dim sErrorLog as string

 sErrorLog = Request("MonitorPath") & "\Log\Debug\Errors"
    If Dir(sErrorLog, vbDirectory) = "" Then
        MkDir sErrorLog
    End If

.
.
.

End Sub

我正在尝试将此代码迁移到C#,我不明白Request("MonitorPath")如何返回字符串。

如果是 - 如何Let没有任何返回类型? 如果不是 - sErrorLog = Request("MonitorPath") & "\Log\Debug\Errors"如何运作?

3 个答案:

答案 0 :(得分:1)

旧的vb6代码的等效C#如下所示:

private string m_Request;
public string Request 
{
   get {return m_Request;}
   set
   {
      m_Request = value;
      ParseRequest(value);
   }
}

与该函数等效的C#是:

public void LogError(RequestParameters Request, string Data, CibErr ibErr)
{
    // the "Request" here is a different Request than the property above
    // I have to guess a bit, but I think it's probably an indexed property
    string ErrorLog = Request["MonitorPath"] + @"\Log\Debug\Errors";

    // There is no need to check if the folder exists.
    // If it already exists, this call will just complete with no changes
    Directory.CreateDirectory(ErrorLog);

    //generally, checking for existence of items in the file system before using them is BAD
    // the file system is volatile, and so checking existence is a race condition
    // instead, you need to have good exception handling
}

对于问题的类型部分,如果未指定项的返回类型,则返回类型为Object。但那只是编译器类型。实际的对象引用将具有从Object继承的更具体的类型。在这种情况下,该类型为String但是,由于编译器只知道Object,如果您只想将对象视为您知道它确实存在的字符串,则必须关闭Option Strict Off。那很糟。非常糟糕,C#不允许在特殊dynamic关键字之外支持此功能。相反,你最好不要一直选择特定的类型。

答案 1 :(得分:1)

如果Request("MonitorPath")位于不包含Property Get/Get Request()的类中,则其使用自身内部称为Request的方法。 (没有实例限定,它不能调用另一个类属性。)

答案 2 :(得分:0)

我认为你正在混淆Request的这两种用法 - 第一种用法可能与第二种用法无关。

请注意,该函数传入一个名为Request的对象 - 如果RequestParameters类似于Dictionary(Of String, String)(C#相当于Dictionary<string, string>),那么它很容易返回Request("MonitorPath")的值,它根本不涉及该属性。

如果这对您没有帮助,那么RequestParameters的结构是什么样的?