我想知道为C#转换对象的更好方法是什么:
MyClassName test = (MyClassName)object;
MyClassName test = object as MyClassName;
Run Code Online (Sandbox Code Playgroud)
我已经知道如果你做第一种方式,你得到一个例外,第二种方式它将test设置为null.但是,我想知道为什么一个在另一个?我看到第一种方式很多,但我喜欢第二种方式,因为那时我可以检查空...
如果没有"更好的方法",那么使用这种或那种方式的准则是什么?
我已经遇到过这种情况并且感到困惑.
Cat c = new Cat("Fluffy");
return (Animal)c;
Cat c = new Cat("Fluffy");
return c as Animal;
Run Code Online (Sandbox Code Playgroud)
这两种语法都存在的原因是什么?
给定F#类型:
type Foo() =
member this.Prop with get() = ()
interface IDisposable with
member this.Dispose() = ()
Run Code Online (Sandbox Code Playgroud)
在C#中,我创建了对象,但我无法调用Dispose():
var x = new Foo();
x.Dispose(); // compile error, x does not contain a definition of Dispose
Run Code Online (Sandbox Code Playgroud)
但是,我可以写:
((IDisposable)x).Dispose(); // works, but I don't like the cast
Run Code Online (Sandbox Code Playgroud)
有没有办法避免C#中的强制转换?这是关系到道路F#并不会自动让你叫.Dispose()的Foo类型从F#中?
我有一些C#代码使用.NET框架中的Xml.Schema类来处理XML模式.各种简单类型限制在框架中被抽象为从Xml.Schema.XmlSchemaFacet派生的一大堆类.除非有一些我错过的东西,否则知道给定方面的哪个派生方面类型的唯一方法是推测性地将其转换为其中一个,在失败的情况下捕获结果的InvalidCastOperation.这样做会让我有一个非常难看的功能:
private void NavigateFacet(XmlSchemaFacet facet)
{
try
{
handler.Length((XmlSchemaLengthFacet)facet);
}
catch(InvalidCastException)
{
try
{
handler.MinLength((XmlSchemaMinLengthFacet)facet);
}
catch(InvalidCastException)
{
try
{
handler.MaxLength((XmlSchemaMaxLengthFacet)facet);
}
catch(InvalidCastException)
{
...
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我认为必须有更优雅的方法来做到这一点; 要么使用我从.NET框架中遗漏的一些属性,要么使用一些聪明的OO技巧.任何人都可以开导我吗?
我一直在阅读SharePoint 2010的工作,我注意到我从书籍到教学视频遇到的许多代码示例都是以我从未在C#中存在的方式构建SharePoint对象(并且认为是VB独有的):
SPWeb web = properties.Feature.Parent as SPWeb;
我习惯于以这种方式进行(在VB之外)进行投射,(SPWeb)properties.Feature.Parent并且只是好奇,如果有任何特殊原因,我遇到的SharePoint上的大多数部分都使用VB-esque强制转换符号.
是否存在这两个if语句会产生不同结果的情况?
if(x as X != null)
{
// Do something
}
if(x is X)
{
// Do something
}
Run Code Online (Sandbox Code Playgroud)
编辑:澄清:我知道运营商(一般)和他们的意思有什么区别.问题是,是否存在这两种情况会产生不同结果的情况.
今天我遇到了一个场景,同时在我的应用程序中实现了搜索功能,让我感到困惑.看看这个片段:
public string GetFirstProductName(SortedList<string, object> itemsList) {
for (int i = 0; i < itemsList.Values.Count; i++) {
if (itemsList.Values[i] is Product)
// Doesn't Compile:
// return (Product)itemsList.Values[i].ProductName;
// Does compile. Precedence for the "." higher than the cast?
return ((Product)itemsList.Values[i]).ProductName;
}
}
}
Run Code Online (Sandbox Code Playgroud)
那么,演员的优先权是什么?是演员吗?as关键字怎么样- 是运营商,它的优先级是什么?
在考虑C#中的isvs as时,您可以使用其中一个来确认某个类型是否可以转换为其他类型.
// using is
Employee e = new Manager();
if (e is Manager) {
var m = (Manager) e;
// m is now type `Manager`
}
// using as
Employee e = new Manager();
Manager m = e as Manager;
// m is now type `Manager`
if (m != null) {
}
Run Code Online (Sandbox Code Playgroud)
我理解这两个操作符的工作方式以及如何使用它们.考虑is操作员在as检查一次时检查类型两次,并且它们对它们支持的转换类型有相同的限制,是否有令人信服的理由使用is?
标记的副本是询问两个运算符之间的区别.我的问题是具体问"理解两者的作用,为什么要使用is?" 它们不是同一个问题,也没有相同的答案.
可能重复:
强制转换与在CLR中使用'as'关键字
你好
何时投射对象以及何时使用“ as”。
例如:
class a =(class)object
以及何时使用
class a = object作为class。
我有一个C#问题,过去几天一直困扰着我.我将尝试根据我正在做的事情的抽象描述来解释它.希望很容易遵循.;)
假设我们有一个界面
interface iFoo {
void a();
}
Run Code Online (Sandbox Code Playgroud)
此外,我有两个实现此接口的类及其中的方法:
class bar1 : iFoo
{
public void a() { Console.WriteLine("bar1"); }
public void anotherMethodBar1() { Console.Write("I love "); }
}
class bar2 : iFoo
{
public void a() { Console.WriteLine("bar2"); }
public void anotherMethodBar2() { Console.Write("beer"); }
}
Run Code Online (Sandbox Code Playgroud)
每个类还提供了一个额外的唯一方法 - anotherMethodBar1()和anotherMethodBar2().现在在我的main()中我想创建一个列表,其中包含实现我的界面的对象,如下所示:
namespace ExampleFooBar
{
class Program
{
static void Main(string[] args)
{
List<iFoo> fooBarObjects = new List<iFoo>();
fooBarObjects.Add(new bar1());
fooBarObjects.Add(new bar2());
for(int i = 0; i < fooBarObjects.Count; i++)
{
if(fooBarObjects[i].GetType() …Run Code Online (Sandbox Code Playgroud)