相关疑难解决方法(0)

即使没有空检查,使用"as"而不是强制转换是否有意义?

在开发博客,在线代码示例和(最近)甚至是一本书中,我一直在寻找像这样的代码:

var y = x as T;
y.SomeMethod();
Run Code Online (Sandbox Code Playgroud)

或者更糟糕的是:

(x as T).SomeMethod();
Run Code Online (Sandbox Code Playgroud)

这对我来说没有意义.如果你确定它x是类型T,你应该使用直接演员:(T)x.如果您不确定,可以使用as但需要null在执行某些操作之前进行检查.以上代码所做的就是将(有用)InvalidCastException变为(无用)NullReferenceException.

我是唯一一个认为这是公然滥用as关键字的人吗?还是我错过了一些明显的东西,上面的模式实际上有意义?

c# casting type-conversion

350
推荐指数
10
解决办法
4万
查看次数

"as"和可空类型的性能惊喜

我刚刚修改了深度C#的第4章,它处理了可空类型,我正在添加一个关于使用"as"运算符的部分,它允许你编写:

object o = ...;
int? x = o as int?;
if (x.HasValue)
{
    ... // Use x.Value in here
}
Run Code Online (Sandbox Code Playgroud)

我认为这非常简洁,它可以提高性能而不是C#1等效,使用"is"后跟一个演员 - 毕竟,这样我们只需要请求动态类型检查一次,然后进行简单的值检查.

然而,情况似乎并非如此.我在下面包含了一个示例测试应用程序,它基本上对对象数组中的所有整数求和 - 但该数组包含许多空引用和字符串引用以及盒装整数.该基准测试您必须在C#1中使用的代码,使用"as"运算符的代码,以及用于踢LINQ解决方案的代码.令我惊讶的是,在这种情况下,C#1代码的速度提高了20倍 - 即使是LINQ代码(考虑到所涉及的迭代器,我预计它会更慢)也胜过"as"代码.

可以isinst为空的类型的.NET实现真的很慢吗?是unbox.any导致问题的附加因素吗?还有另一种解释吗?目前,我觉得我必须在性能敏感的情况下包含警告,禁止使用它...

结果:

演员:10000000:121
As:10000000:2211
LINQ:10000000:2143

码:

using System;
using System.Diagnostics;
using System.Linq;

class Test
{
    const int Size = 30000000;

    static void Main()
    {
        object[] values = new object[Size];
        for (int i = 0; i < Size - 2; i += 3)
        {
            values[i] = null;
            values[i+1] …
Run Code Online (Sandbox Code Playgroud)

c# clr performance unboxing nullable

326
推荐指数
10
解决办法
3万
查看次数

Convert.ToString()和.ToString()之间的区别

Convert.ToString()和之间有什么区别.ToString()

我在网上发现了很多不同之处,但主要区别是什么?

c# tostring type-conversion

149
推荐指数
8
解决办法
11万
查看次数

C#"as"演员与经典演员

可能重复:
使用CLR中的'as'关键字进行转换

我最近了解了一种不同的演员方式.而不是使用

SomeClass someObject = (SomeClass) obj;
Run Code Online (Sandbox Code Playgroud)

可以使用以下语法:

SomeClass someObject = obj as SomeClass;
Run Code Online (Sandbox Code Playgroud)

如果obj不是SomeClass,它似乎返回null,而不是抛出一个类转换异常.

我看到如果转换失败并且我尝试访问someObject变量,这可能导致NullReferenceException.所以我想知道这种方法背后的理由是什么?为什么要使用这种方式而不是(旧)方式 - 它似乎只是将失败的演员问题"更深"地转移到代码中.

c# casting

132
推荐指数
4
解决办法
9万
查看次数

转换:(NewType)与Object作为NewType

可能重复:
使用CLR中的'as'关键字进行转换

这两个演员之间究竟有什么区别?

SomeClass sc = (SomeClass)SomeObject;
SomeClass sc2 = SomeObject as SomeClass;
Run Code Online (Sandbox Code Playgroud)

通常,它们都应该显式转换为指定的类型?

.net c#

85
推荐指数
5
解决办法
8123
查看次数

在C#中使用"as"之间有什么区别?

如果存在差异,则执行以下演员的两种方式之间有什么区别?

在这种情况下e是一个GridViewRowEventArgs对象.

GridView gv = (GridView)e.Row.FindControl("gv"); //first way

GridView gv2 = e.Row.FindControl("gv") as GridView; //second way
Run Code Online (Sandbox Code Playgroud)

c#

44
推荐指数
2
解决办法
3380
查看次数

处理DBNull的最佳方法是什么?

我经常遇到处理DataRows退回的问题SqlDataAdapters.当我尝试使用如下代码填充对象时:

DataRow row = ds.Tables[0].Rows[0];
string value = (string)row;
Run Code Online (Sandbox Code Playgroud)

DBNull's在这种情况下处理这种情况的最佳方法是什么.

.net c# sql-server

42
推荐指数
5
解决办法
6万
查看次数

施放然后检查或检查然后施放?

可能重复:
使用CLR中的'as'关键字进行转换

哪种方法被认为是最佳做法?

先投?

public string Describe(ICola cola)
{
    var coke = cola as CocaCola;
    if (coke != null)
    {
        string result;
        // some unique coca-cola only code here.
        return result;
    }
    var pepsi = cola as Pepsi;
    if (pepsi != null)
    {
        string result;
        // some unique pepsi only code here.
        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

或者我应该先检查,然后再投?

public string Describe(ICola cola)
{
    if (cola is CocaCola)
    {
        var coke = (CocaCola) cola;
        string result;
        // some unique coca-cola only code …
Run Code Online (Sandbox Code Playgroud)

c# casting

16
推荐指数
2
解决办法
5355
查看次数

C#不同的铸造方式 - (T)obj vs obj as T

可能重复:
使用CLR中的'as'关键字进行转换

我在C#中看到了两种不同的方式.

例如:

MyObj foo = (MyObj) bar; // this is what I see most of the times
MyObj foo = bar as MyObj; // I do see this sometimes
Run Code Online (Sandbox Code Playgroud)
  • 那么,基本的区别是什么?
  • 什么是style 1style 2铸造的专有名称?
  • 我如何决定何时使用什么?
  • 有任何重大的性能问题吗?
  • 我还应该知道与此主题相关的其他内容吗?

非常感谢您对此进行调查:)

.net c# casting

11
推荐指数
1
解决办法
6317
查看次数

如何将对象列表存储到ViewState中

我有一个类型列表List<JobSeeker>.我想将它存储在ViewState中.怎么做到这一点?

private List<JobSeeker> JobSeekersList { get; set; }
Run Code Online (Sandbox Code Playgroud)

.net c# asp.net viewstate list

11
推荐指数
1
解决办法
3万
查看次数