相关疑难解决方法(0)

比较.NET中的两个字节数组

我怎么能快速做到这一点?

当然,我可以这样做:

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.

请注意我的超快速的答案在这里.

.net c# j# arrays performance

513
推荐指数
15
解决办法
29万
查看次数

为什么明确实现接口?

那么,明确实现接口的一个好用例究竟是什么?

是否仅仅是因为使用该类的人不必在intellisense中查看所有这些方法/属性?

c# interface

118
推荐指数
8
解决办法
3万
查看次数

隐式vs显式接口实现

可能重复:
C#:接口 - 隐式和显式实现

有人会解释这两种野兽之间的差异以及如何使用它们.AFAIK,许多pre.2.0类在没有泛型类型的情况下实现,因此导致后一版本实现这两种接口.是否需要使用它们的唯一情况?

你能否深入解释如何使用它们?

谢谢

.net c# interface

73
推荐指数
2
解决办法
4万
查看次数

为什么C#Dictionary没有实现所有的IDictionary?

我想创建一个类似于字典的对象,并认为正确的方法是实现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: 或者,我错过了什么? …

c# dictionary idictionary

26
推荐指数
1
解决办法
5928
查看次数

如何仅部分实现具有抽象类的接口时满足编译器?

这里有一个名为的界面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# abstract-class

22
推荐指数
3
解决办法
1134
查看次数

在C#中使用抽象类的接口

我正在学习来自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()).

我想解决方案很简单,但我尝试了各种各样的事情,因为我的生活无法想象这一点.

c# inheritance abstract-class interface

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

关于.NET继承/转换的一些我不明白的事情?

请参阅以下简单的转换示例:

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的情况下重现此行为吗?

.net c# inheritance casting interface

18
推荐指数
3
解决办法
757
查看次数

在C#中明确实现接口与实现接口

我在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#中实现接口有两种选择?

c# interface visual-studio-2010 visual-studio

16
推荐指数
3
解决办法
5058
查看次数

为什么HttpWebResponse上没有Dispose方法

HttpWebReponse实现IDisposable接口,但为什么没有Dispose方法.它只包含Close方法.using这个类仍然可以使用模式吗?

.net c# idisposable using-statement

15
推荐指数
1
解决办法
5340
查看次数

明确实现IDisposable

虽然IDisposable在SO上有相当多的问答,但我还没有找到答案:

我通常遵循这样的做法:当我的一个类拥有一个IDisposable对象时,它也实现IDisposable并调用Dispose拥有的对象.但是最近我遇到了一个IDisposable明确实现的类,因此阻止我直接Dispose强制我强制转换它,我觉得这很烦人且没必要.

所以问题是:为什么以及何时想要使用显式接口实现IDisposable?我知道明确地实现接口有完全正确和有效的理由但是对于IDisposable我来说不明确的原因.

.net c# idisposable explicit-interface

14
推荐指数
1
解决办法
1819
查看次数