C# Ref参数未被归类为变量-更好地解决这个问题?

C# Ref参数未被归类为变量-更好地解决这个问题?,c#,C#,我有一段从VB.NET转换而来的代码 private static void PrivateExecuteNonQuery(ref Providers enumProvider, ref string statement, ref CommandType commandType, ref ArrayList paramCollection, ref IDbConnection conn, ref Int16 CommandTimeout) { ExecuteSql

我有一段从VB.NET转换而来的代码

    private static void PrivateExecuteNonQuery(ref Providers enumProvider, ref string statement, ref CommandType commandType, ref ArrayList paramCollection, ref IDbConnection conn, ref Int16 CommandTimeout)
    {
        ExecuteSqlServerNonQuery(ref statement, ref commandType, ref paramCollection, ref (SqlConnection)conn, ref CommandTimeout);
    }
我得到一个错误,因为它说ref(SqlConnection)conn不是变量的形式,所以我猜您不能为ref传入方法params

因此,这对我来说似乎是一个骇人的解决方案:

    private static void PrivateExecuteNonQuery(ref Providers enumProvider, ref string statement, ref CommandType commandType, ref ArrayList paramCollection, ref IDbConnection conn, ref Int16 CommandTimeout)
    {
        SqlConnection sqlConnection = (SqlConnection)conn;

    ExecuteSqlServerNonQuery(ref statement, ref commandType, ref paramCollection, ref sqlConnection, ref CommandTimeout);
    }

有人知道更好的方法来满足这个ref或者使它更干净吗?

ref的目的是允许方法修改调用者传入的变量的内容。如果由于不加区别地使用了
ByRef
的Visual Basic代码的转换,您有附带的
ref
参数,那么您最终会遇到这种情况

你有两个选择:

  • 删除调用者和被调用者中不必要的
    ref
    参数限定符,或
  • 使用real变量,如果必须,使用伪变量作为方法的参数
因此,答案是,不,没有更好的方法可以做到这一点,而不排除不必要的
ref
参数限定符


什么是不必要的
ref
参数限定符?它适用于在方法体的任何位置都没有实际指定的参数。大多数参数不需要是
ref
,而那些参数需要是
ref
的,从检查方法的逻辑来看通常是非常明显的。

只要去掉所有的ref……你不应该修改这些参数中的任何一个……你使用
ref
参数有什么原因吗?老实说,我看到了警告灯。看起来你不能同时通过
ref
和打字。我将不得不在两行中,但它看起来一点也不“黑客”。它可能看起来“黑客”,但这正是VB在幕后所做的。在你的另一个问题(现已删除)中,实际上是昨天的一个问题中,你展示了VB版本的源代码,所有参数都是
ByVal
。因此,正如您介绍的
ref
一样,C#转换并不纯粹。问题是“为什么?”这是故意的还是可能是误解?