我怎么能快速做到这一点?
当然,我可以这样做:
static bool ByteArrayCompare(byte[] a1, byte[] a2)
{
if (a1.Length != a2.Length)
return false;
for (int i=0; i<a1.Length; i++)
if (a1[i]!=a2[i])
return false;
return true;
}
Run Code Online (Sandbox Code Playgroud)
但我正在寻找BCL功能或一些经过高度优化的可靠方法来实现这一目标.
java.util.Arrays.equals((sbyte[])(Array)a1, (sbyte[])(Array)a2);
Run Code Online (Sandbox Code Playgroud)
很好地工作,但它看起来不适用于x64.
请注意我的超快速的答案在这里.
那么,明确实现接口的一个好用例究竟是什么?
是否仅仅是因为使用该类的人不必在intellisense中查看所有这些方法/属性?
可能重复:
C#:接口 - 隐式和显式实现
有人会解释这两种野兽之间的差异以及如何使用它们.AFAIK,许多pre.2.0类在没有泛型类型的情况下实现,因此导致后一版本实现这两种接口.是否需要使用它们的唯一情况?
你能否深入解释如何使用它们?
谢谢
我想创建一个类似于字典的对象,并认为正确的方法是实现IDictionary<K,V>接口,并使用组合来包含底层字典.我从下面开始(K= string,V= int)
public class DictionaryLikeObject : IDictionary<string,int> {
Dictionary<string,int> _backingDictionary = new Dictionary<string,int>();
}
Run Code Online (Sandbox Code Playgroud)
然后我使用Visual Studio的"实现接口"功能来删除我需要的所有封面方法.
IDictionary似乎不存在三种方法Dictionary:
void Add(KeyValuePair<string, int> item);
void CopyTo(KeyValuePair<string, int>[] array, int arrayIndex);
bool Remove(KeyValuePair<string, int> item);
Run Code Online (Sandbox Code Playgroud)
然而,Microsoft文档清楚地表明了这些Dictionary工具IDictionary.所以我希望这三种方法可用.要从文档中复制,请定义Dictionary<K,V>
[SerializableAttribute]
[ComVisibleAttribute(false)]
public class Dictionary<K, V> : IDictionary<K, V>,
ICollection<KeyValuePair<K, V>>, IEnumerable<KeyValuePair<K, V>>,
IDictionary, ICollection, IEnumerable, ISerializable, IDeserializationCallback
Run Code Online (Sandbox Code Playgroud)
我相信这三种缺失的方法都可以在ICollection<>.而且还有其他方法,比如Clear()那个Dictionary确实有.
问题1: 如果没有实现这三个,C#如何逃脱?为什么会这样?我怀疑这是一个编译错误(我的推理,见下文). 问题2: 或者,我错过了什么? …
这里有一个名为的界面IFish.我想用一个抽象的class(WalkingFishCommon)派生它,它提供了一个不完整的实现,因此派生的类WalkingFishCommon不必实现该CanWalk属性:
interface IFish
{
bool Swim();
bool CanWalk { get; }
}
abstract class WalkingFishCommon : IFish
{
bool IFish.CanWalk { get { return true; } }
// (1) Error: must declare a body, because it is not marked
// abstract, extern, or partial
// bool IFish.Swim();
// (2) Error: the modifier 'abstract' is not valid for this item
// abstract bool IFish.Swim();
// (3): If no declaration is provided, compiler says …Run Code Online (Sandbox Code Playgroud) 我正在学习来自C++的C#并且遇到了问题.
我有一个抽象类AbstractWidget,一个接口IDoesCoolThings,以及一个派生自AbstractWidget的类,名为RealWidget:
public interface IDoesCoolThings
{
void DoCool();
}
public abstract class AbstractWidget : IDoesCoolThings
{
void IDoesCoolThings.DoCool()
{
Console.Write("I did something cool.");
}
}
public class RealWidget : AbstractWidget
{
}
Run Code Online (Sandbox Code Playgroud)
当我实例化一个RealWidget对象并在其上调用DoCool()时,编译器给出了一个错误说法
'RealWidget'不包含'DoCool'的定义
我可以将RealWidget对象转换为IDoesCoolThings,然后调用就可以了,但这似乎是不必要的,我也失去了多态性(即使我定义了RealWidget.DoCool(),也总是会调用AbstractWidget.DoCool()).
我想解决方案很简单,但我尝试了各种各样的事情,因为我的生活无法想象这一点.
请参阅以下简单的转换示例:
int i = 1000;
object o = (object)i; // cast
i.CompareTo(1000);
o.CompareTo(1000); // error
Run Code Online (Sandbox Code Playgroud)
我理解为什么最后一行会产生错误.与int不同,对象不实现IComparable,因此不公开该CompareTo方法.以下还会生成错误:
string s = (string)i; // cast error
Run Code Online (Sandbox Code Playgroud)
由于ints和字符串之间没有继承,因此这里的转换不起作用.现在,看看这个:
AudioRender a = new AudioRender();
IBaseFilter b = (IBaseFilter)a; // cast
a.Run(1000); // error
b.Run(1000);
Run Code Online (Sandbox Code Playgroud)
(这些类来自DirectShowNet库.)
我不明白这一点.强制转换不会生成错误,并且在运行时不会抛出任何异常,因此我假设AudioRender实现了IBaseFilter.但是,AudioRender没有暴露任何IBaseFilter的方法,表明我的上述假设是错误的......
如果a实现b,为什么不a公开方法b?
否则,如果a没有实施b,为什么可以a投入b?
此外,我可以在不使用DirectShowNet的情况下重现此行为吗?
我在VS2010中有两个用于实现接口的选项.

当我有IHelper.cs接口时如下:
public interface IHelper
....
IEnumerable<IPort> Ports { get; }
Run Code Online (Sandbox Code Playgroud)
"显式实现接口"给出了以下代码:
IEnumerable<IPort> IHelper.Ports
{
get
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
并且,"实现接口"给了我这个代码:
public IEnumerable<IPort> Ports
{
get
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
它们是相同还是不同?为什么我在C#中实现接口有两种选择?
HttpWebReponse实现IDisposable接口,但为什么没有Dispose方法.它只包含Close方法.using这个类仍然可以使用模式吗?
虽然IDisposable在SO上有相当多的问答,但我还没有找到答案:
我通常遵循这样的做法:当我的一个类拥有一个IDisposable对象时,它也实现IDisposable并调用Dispose拥有的对象.但是最近我遇到了一个IDisposable明确实现的类,因此阻止我直接Dispose强制我强制转换它,我觉得这很烦人且没必要.
所以问题是:为什么以及何时想要使用显式接口实现IDisposable?我知道明确地实现接口有完全正确和有效的理由但是对于IDisposable我来说不明确的原因.
c# ×10
.net ×5
interface ×5
idisposable ×2
inheritance ×2
arrays ×1
casting ×1
dictionary ×1
idictionary ×1
j# ×1
performance ×1