3

我最近发现(感谢针对核心 2.2 的损坏构建)现在这在 C# 8 中是合法的

public interface ISimple
{
    public string Simon { get; }
}

ISimple是一个接口,Simon没有实现,但public关键字是允许的。
我知道接口public中有默认实现,但这个属性没有实现。

与此相比,这绝对是意料之中的

public interface ISimple
{
    public string Simon => "met a pie man";
}

我怀疑这是一个疏忽;如果不是,那么这样做的理由是什么?能有什么用?

4

1 回答 1

3

更深更深的含义是 DIM 背后的真正动机是 Xamarin/Android 互操作。

Android 和 Java 使用 DIM 进行接口版本控制。一个 Android 应用程序必须在数十个 Android SDK 级别上运行,并且 DIM 用于为为旧版本的 SDK 构建的应用程序提供默认实现。如果 Xamarin 应用程序可以直接使用或覆盖这些实现,它将真正受益。

例如LifeCycleObserver接口用于通知应用程序特定的生命周期事件。应用程序可以实现这一点以获得事件通知。DefaultLifeCycleObserver接口使用的默认方法来提供默认实现,因此应用程序不必处理所有状态。可以添加新状态并且应用程序根本不必更改:

/**
 * Callback interface for listening to {@link LifecycleOwner} state changes.
 * <p>
 * If you use Java 8 language, <b>always</b> prefer it over annotations.
 */
@SuppressWarnings("unused")
public interface DefaultLifecycleObserver extends FullLifecycleObserver {
    /**
     * Notifies that {@code ON_CREATE} event occurred.
     * <p>
     * This method will be called after the {@link LifecycleOwner}'s {@code onCreate}
     * method returns.
     *
     * @param owner the component, whose state was changed
     */
    @Override
    default void onCreate(@NonNull LifecycleOwner owner) {
    }

Android-DisposeBag会覆盖此默认实现以在应用程序暂停或关闭时处理 ReactiveJava 流:

class DisposeBag @JvmOverloads constructor(owner: LifecycleOwner,
                                           private val event: Lifecycle.Event = DisposeBagPlugins.defaultLifecycleDisposeEvent)
    : Disposable, DisposableContainer, DefaultLifecycleObserver {

...

    override fun onPause(owner: LifecycleOwner) {
        if (event == Lifecycle.Event.ON_PAUSE) dispose()
    }

    override fun onStop(owner: LifecycleOwner) {
        if (event == Lifecycle.Event.ON_STOP) dispose()
    }

    override fun onDestroy(owner: LifecycleOwner) {
        if (event == Lifecycle.Event.ON_DESTROY) dispose()
    }

如果Azure SDK 开始使用 DIM ,我不会感到惊讶。modern cloud environments这可以解释为什么 Scott Hunter在 .NET Conf 主题演讲中一直在谈论DIM。

于 2019-10-09T13:49:56.257 回答