C#“as”运算符和高级转换用于循环/函数和out / ref参数修饰符和typeof()

时间:2013-07-17 23:50:38

标签: c# out ref typeof

我需要澄清一下:

是/作为运算符

out / ref参数修饰符

typeof运算

如果您不喜欢,请随意回复您所知道或想要回复的内容,而不是回答整个问题。

是的,我要求澄清这些。纠正我或添加到我已经说过的内容。

好吧,我已经google了一下,并登陆了各种网站,MSDN等等。我仍然需要有人写一些代码来帮助我澄清整个概念,最后让我充分利用它,希望这对其他人也有帮助。

基本上这就是我所理解的:

A)

在伪代码中

如果object是此类型,则返回true,否则返回false

易。或者我在这里做错了什么?

某些类型是否存在任何限制或问题?

这段代码运行正常,所以我觉得我很好。

object s = new SqlBoolean();
        if (s is SqlBoolean)
        {
            Console.WriteLine("Is SqlBoolean");
            Console.ReadLine();
        }

2) as

好吧,我还是要完全理解这一点。

MSDN报告:

  

as运算符用于执行兼容之间的转换   类型。 as运算符就像一个转换,除了它产生null   转换失败而不是引发异常。

我在Object数组上尝试了一个循环,它基本上只转换了原语并且遇到了很多问题(每次转换都有点难以抛出null或其他东西)

using System;
using System.Data.SqlTypes;

class StackOverflow
{
    public static void Main()
    {
        string country = "jii";
        string vatNum= "dde";

        object[] MyObjects = {country,
                              vatNum
                             };

        for (int i = 0; i<=MyObjects.Length-1;i++)
        {
            MyObjects[i] = MyObjects[i] as SqlString?;
            Console.WriteLine(MyObjects[i].ToString() + " " + MyObjects[i].GetType());
            Console.ReadLine();
        }
    }
} 

在我正在编写的程序中,我需要将这些值转换为SqlStrings,SqlBooleans等。

请注意我使用“SqlString”行强制SqlString为Nullable这一事实最后带问号(?强制可以为空,谁知道它!:D)。

所以基本上它可以在不使用异常的情况下进行一些低级转换吗?或者是什么?

3)参考结束

基本上,ref会在函数中更改预先声明的变量的值:

IE

using System;

class StackOverflow
{
    public static void Main()
    {
        int x = 10;
        Write(func(ref x).ToString());
        Write(Convert.ToString(x));
    }

    public static int func(ref int y)
    {
        y += 10;
        return y;
    }

    public static void Write(string z)
    {

        Console.WriteLine(z);
        Console.ReadLine();

    }
} 

执行此操作即可,输出将为20 20 删除两个ref将输出20 10

(ref直接更改外部声明的x而不在方法中创建实例)

怎么样?有什么用????

我无法得到它。在某个地方读取它似乎就像参数一样做了ref,但它让你以某种方式有一些输出参数。

在先前显示的代码中输出而不是ref只会产生IntelliSense的编译错误,我甚至不知道如何显示这些参数。

在我正在做的项目中,我正在使用以下代码:

public static Array check(string country, string vatNum)
{
    bool valid;
    string name;
    string address;
    checkVatService vatchecker = new checkVatService();
    vatchecker.checkVat(ref country, ref vatNum, out valid, out name, out address);

    return new object[] {country,
                         vatNum,
                         valid,
                         name,
                         address
                         };
}

现在,checkVat是european online checking webservice.

中的一些代码

我看到它有参数,它们是由webservice网站(link to library, if needed)的wsdl webservice消费库生成的,

如何使用out参数?他们是否有一些输出而不使用返回?我怎么用它们?请非常详细

4) typeof

这将返回您传递给它的Type的System.Type类型。

首先我认为我可以获得我传递给它的任何对象的类型,如

int x;
SqlBoolean xy = new SqlBoolean();
typeof(x) // integer
typeof(xy) // SqlBoolean

但不是那样。

它只返回System.Type中的类型。

typeof(int).ToString()// System.Int32或类似的东西 typeof(xy).ToString()// System.Data.SqlTypes.SqlSqlBoolean

我真的不知道该怎么做。

要获取对象的类型,你必须从对象中执行类似.GetType的操作。

那么什么是对typeof的实际使用以及我对它的缺失?

谢谢任何人

5 个答案:

答案 0 :(得分:2)

大问题..小答案:

  1. 正确。
  2. 它允许强制转换失败而没有例外。因此,您可以检查结果是否为null。如果是,则演员失败。
  3. ref通过引用传递对象(注意:尽管仍然按值传递语义!)。 out表示必须在函数退出之前分配变量。
  4. 我不确定我是否理解typeof的问题。如果你不理解为什么它可能有用(如同任何东西,真的那样),最好忽略它的使用。

答案 1 :(得分:1)

1)你对于操作员是正确的 2)as运算符的使用是它抑制了错误情况的异常,这样当一个强制转换错误时它会抛出null。
3)如需参考,请参阅以下链接,详细说明见Why use the 'ref' keyword when passing an object?
4)out参数通常用于需要从函数返回多个值的情况。使用return语句直接返回一个值,使用out参数返回其他值。 例如,清楚的理解参考what is use of out parameter in c#。你可以在那里找到jon双向飞碟的优秀文章 5)可能会出现需要检查对象类型以执行ceratain操作的情况,但大多数情况下不应根据RTTI设计原则使用

答案 2 :(得分:1)

答案 3 :(得分:1)

类型 GetType 都不同,可以输出不同的结果。 Refer to this SO post因为我见过最简单的解释。

<小时/> 引用和退出

默认情况下,方法的参数是按值传递,这意味着在传递给方法时会复制参数的值。如果您有foo(int y){y = 9;} main(){int x = 5; Foo(x);},则方法Foo将x的值复制到y,然后为y指定不同的值。 x仍为5.如果您有引用类型参数,例如Foo(object y){y = null;} main(){object x = new object(); Foo(x);},则y包含复制的x值,它是参考值而不是对象本身。因此,对y的更改也不会反映在x中。相比之下,ref和out 通过引用传递

// Example of ref:
// p DOES NOT copy x's reference value of the object
// p is x (or refer to the same memory as x)

class Ref_Example
{
   static void Foo(ref int p) { p = 8};
   static void Main() { 
      int x = 5; Foo(ref x);
      Console.WriteLine(x);    // output: 8 
   }
}

// Example of out:
// out = ref, except variables need not be assigned before method is called
// You use out when you have to return multiple values from a function  
Class Out_Example
{
   static void Find_Synonyms(
          string vocab, out string synonymA, out string synonymB)
   { // Lookup the synonyms of the word "rich" };

   static void Main()
   {
      string a, b;
      Find_Synonyms("rich", a, b);
      Console.WriteLine(a);   // abundant
      Console.WriteLine(b);   // affluent
}

当然你可以打破设计的ref / out,并通过为变量赋值初始值来使用ref代替out,但它没有逻辑意义,可能会让代码阅读器感到困惑。 (也就是说,在你完成搜索之前你会怎么知道这些同义词?为什么你会给它分配一个不正确的初始值?等等。)


<小时/>

进一步说明:

int = System.Int32 SqlBoolean = System.Data.SqlTypes.SqlBoolean。 int只是一个别名,可能是由于传统,而System.Int32是C#类型的完整表示/名称。将int x公开给x.Equalsx.ToStringx.Parse等方法的内容是什么? System.Int32。在C#中,类型是类(例如System.Int32),其成员定义数据或引用类型。

答案 4 :(得分:-1)

这是我得到out和ref自我概念后的真实答案。

参考 - &gt;如果先前已在您调用的方法之外初始化变量并且希望该方法为其分配结果值,则将param作为ref传递。

Out - &gt;当您调用的方法之外的变量可能被分配或未被分配并且您希望该方法为其提供结果值时,您将param作为输出传递

AS-&GT;没有抛出异常的演员。

此外,this