相关疑难解决方法(0)

当我可以直接实现这些方法时,为什么我应该在C#中使用接口

我知道这是一个非常基本的问题,但是一位采访者以非常戏法的方式问我,我很无奈:(

我只知道接口的材料或理论定义,并且在我工作的许多项目中也实现了它.但我真的不明白为什么以及如何有用.

我也不了解界面中的一件事.即,例如,我们使用

conn.Dispose();在最后一块.但我没有看到该类正在实现或继承IDisposableinterface(SqlConnection)类我的意思.我想知道如何调用方法名称.同样,我不了解Dispose方法是如何工作的,因为我们需要使用我们自己的实现为所有接口方法实现函数体.接口如何被接受或命名为合同?到目前为止,这些问题一直在我心中滚动,坦率地说,我从来没有看到任何能以我能理解的方式解释我的问题的好线程.

MSDN像往常一样看起来非常可怕,没有一行是明确的(伙计们,善意的理由是谁进入高级开发,我强烈认为任何代码或文章应该达到任何人看到它的想法,因此像许多人说的那样,MSDN是没用的).

采访者说:

他有5种方法,他很乐意直接在课堂上实现它,但如果你必须选择抽象类或接口,你选择哪一种,为什么?我确实回答了他在各种博客中读到的所有内容,说明抽象类和界面的优缺点,但他不相信,他试图理解"为什么界面"."为什么抽象类"一般,即使我只能实现相同的方法一次而不是改变它.

我看不到网络中的任何地方,我可以得到一篇文章,可以清楚地解释我的接口及其功能.我是众多程序员中的一员,他们仍然不了解接口(我知道我使用的理论和方法)但不满意我清楚地理解它.

c# oop abstraction interface class

106
推荐指数
6
解决办法
8万
查看次数

除了null之外,为什么我不能将默认值作为可选参数?

我想要一个可选参数并将其设置为我确定的默认值,当我这样做时:

private void Process(Foo f = new Foo())
{

}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误(Foo是一个类):

'f'是Foo的类型,除string之外的引用类型的默认参数只能用null初始化.

如果我Foo改为struct那么它可以工作,但只有默认的无参数构造函数.

我阅读了文档,它清楚地表明我不能这样做,但它没有提到为什么?,为什么这个限制存在,为什么string被排除在外呢?为什么可选参数的值必须是编译时常量?如果那不是一个常数那么副作用会是什么?

c# optional-parameters

21
推荐指数
2
解决办法
5257
查看次数

为什么默认方法参数必须是C#中的编译时常量

编辑1:我知道有一些替代品,如伸缩式,这是一个纯粹的教育问题.

我知道这是真的,但为什么一定是这样呢?看起来像是这样的:

public class Foo{

    private int bar;

    public void SetBar(int baz = ThatOtherClass.GetBaz(3)){
        this.bar = baz;
    }

}
Run Code Online (Sandbox Code Playgroud)

编译器可以将方法更改为:

public void SetBar(int baz){

//if baz wasn't passed:
baz = ThatOtherClass.GetBaz(3);

this.bar = baz;

}
Run Code Online (Sandbox Code Playgroud)

为什么那不起作用,或者不行,这只是一个设计决定?

c# default compile-time-constant

8
推荐指数
1
解决办法
502
查看次数