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

C# “as” operator and advanced conversion use in loops/functions and out/ref parameters modifiers and typeof()

本问题已经有最佳答案,请猛点这里访问。

我需要澄清一下:

IS/AS算子

out/ref参数修改器

类型

如果你不喜欢的话,你可以只回答你知道的或者你想回答的问题,而不是整个问题。

是的,我想澄清一下。纠正我,或者补充我已经说过的话。

嗯,我在谷歌上搜索了一点,然后登陆了不同的网站,msdn等等。我仍然需要有人写一些代码来帮助我澄清整个概念,最后让我充分利用它,希望这对其他人也有帮助。

基本上这就是我理解的:

a)

伪码

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

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

某些类型有什么限制或问题吗?

这段代码运行得很好,所以我想我做得很好。

1
2
3
4
5
6
object s = new SqlBoolean();
        if (s is SqlBoolean)
        {
            Console.WriteLine("Is SqlBoolean");
            Console.ReadLine();
        }

2)

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

MSDN报告:

The as operator is used to perform conversions between compatible
types. The as operator is like a cast except that it yields null on
conversion failure instead of raising an exception.

我在一个对象数组上尝试了一个循环,它基本上只转换原语,并且有很多问题(每一个强制转换都有一点困难,就会抛出空值或其他东西)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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为空。结尾有问号(?力为零,谁知道呢!D)。

所以基本上,它对于在不使用异常的情况下进行一些低级转换很有用?或者什么?

3)REF和OUT

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

工业工程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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删除两个参考将输出20 10

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

出去怎么样?有什么用?????

我拿不到。在某个地方读取,它看起来像是一个执行相同的ref的参数,但它可以让您以某种方式拥有一些输出参数。

在前面显示的代码中使用out而不是ref只会通过intellisense产生编译错误,我甚至不知道如何获取要显示的out参数。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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是来自欧洲在线检查Web服务的一些代码。

我看到它有一些参数,它们是由WebService网站的WSDL WebService消费库生成的(如果需要,链接到库)。

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

4)类型

这将从System返回类型。传递给它的类型的类型。

首先我想我可以得到我传递给它的任何物体的类型

1
2
3
4
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.sqlsqlbolean

我真的不知道该怎么办。

为了得到一个对象的类型,你必须做一些类似的事情,从一个对象中获取类型。

那么排字的实际用途是什么,我遗漏了什么?

谢谢任何人


大问题..小答案:

  • 对的。
  • 它允许强制转换毫无例外地失败。因此,您可以检查结果是否为null。如果是这样,演员阵容就失败了。
  • ref通过引用传递对象(注意:仍然通过值语义!).out表示函数退出前必须给变量赋值。
  • 我不确定我是否理解你对typeof的问题。如果你不明白为什么它可能有用(实际上,对于任何东西来说),最好不要理会它的使用。

  • typeof,gettype,is都是不同的,可以输出不同的结果。请参考这篇文章,因为这里有我见过的最简单的解释。

    参考与输出

    默认情况下,方法的参数是按值传递的,这意味着当传递给方法时,参数的值会被复制。如果您有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是通过引用传递的:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    // 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
    }

    当然,您可以打破为什么设计的引用/输出,并通过给变量分配一个初始值来使用引用代替输出,但是它没有逻辑意义,可能会混淆代码阅读器。(即,在搜索同义词之前,您如何知道这些同义词?为什么你给它分配了一个不正确的初始值?等)



    进一步说明:

    int=System.Int32,sqlbolean=System.Data.SqlTypes.SqlBoolean。int只是一个别名,可能是由于传统,而System.Int32是C类型的完整表示/名称。是什么使int x暴露于x.Equalsx.ToStringx.Parse等方法?系统32。在C中,类型是具有定义数据或引用类型的成员的类(例如System.Int32)。


    你答对了的问题。

    b)也许这会带来光明-

    http://blogs.msdn.com/b/ericlippert/archive/2009/10/08/what-s-the-difference-between-as-and-cast-operators.aspx

    http://msdn.microsoft.com/en-us/library/ms173105.aspx

    对于其余部分和以上内容,本codeproject教程(分两部分)可能会有所帮助:

    http://www.codeproject.com/Articles/3114/C-Keywords-Part-I-Modifier-Keywords

    http://www.codeproject.com/Articles/3424/C-Keywords-Part-II-Type-Conversion-Operators-and-O


    1)关于IS操作员,您是正确的。2)as运算符的使用是,它抑制错误情况的异常,以便当强制转换错误时,它抛出空值。3)对于引用,请参考下面的链接,这里给出了详细的解释,为什么在传递对象时使用"ref"关键字?4)out参数通常用于需要从函数返回多个值的情况。一个值使用RETURN语句直接返回,另一个值使用OUT参数返回。例如,清晰的理解是指C中out参数的用法。你可以在那里找到乔恩·斯基特的优秀文章。5)可能会出现需要检查对象类型以执行ceratain操作的情况,但大多数情况下不应根据rtti设计原则使用。


    这是在我了解了out和ref的概念之后的真实答案。

    当您先前在调用的方法之外初始化了一个变量,并且希望该方法为其分配一个结果值时,您可以将一个参数作为ref传递。

    out->当您调用的方法之外的变量可能已被分配或未被分配,并且您希望该方法将结果值赋给它时,可以将参数作为输出传递。

    as->在不引发异常的情况下执行强制转换。

    而且,这个