这是一个关于C#基础知识的哲学问题:我想知道完全抽象类可以模拟接口的接近程度.假设我们有以下界面:
public interface INativeInterface
{
void PerformAction();
String Property { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
以下是抽象类:
public abstract class ISimulatedInterface
{
public abstract void PerformAction();
public abstract String Property { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
他们有很多共同点,不是吗?我所知道的差异是:
使用反射或类似的东西可以跳过这些限制吗?
我意识到接口和抽象类在root中是不同的:接口声明了" 可以表现得像 " 的条件,抽象类 - " 是一种 ",但即使这似乎是如此接近以至于这些实体之间的低级别差异要讨论的.这个问题甚至可以听起来像"你会用C++创建一个接口".
考虑我们有一个声明事件的类:
public class FooBar
{
public event EventHandler FooBarEvent;
}
Run Code Online (Sandbox Code Playgroud)
尽管事件"公开",但我们不能FooBarEvent.Invoke从外面打电话.
通过使用以下方法来修改类,克服了这一问题:
public class FooBar
{
public event EventHandler FooBarEvent;
public void RaiseFooBarEvent(object sender, EventArgs eventArguments)
{
FooBarEvent.Invoke(sender, eventArguments);
}
}
Run Code Online (Sandbox Code Playgroud)
为什么只能通过添加和删除侦听器来限制访问外部公共事件?
所有C#初学者都知道这class是一个引用类型并且struct是一个值.建议使用结构作为简单存储.它们也可以实现接口,但不能从类派生,也不能起到基类的作用,因为它具有相当"价值"的性质.
假设我们对主要差异有所了解,但有一个困扰我.看看下面的代码:
public class SampleClass
{
public void AssignThis(SampleClass data)
{
this = data; //Will not work as "this" is read-only
}
}
Run Code Online (Sandbox Code Playgroud)
这很明显 - 当然我们不允许改变对象自己的指针,尽管在C++中这样做是一种简单的做法.但:
public struct SampleStruct
{
public void AssignThis(SampleStruct data)
{
this = data; //Works fine
}
}
Run Code Online (Sandbox Code Playgroud)
它为什么有效?它确实看起来struct this不是一个指针.如果是真的,上面的分配如何工作?有自动克隆的机制吗?如果class结构内部会发生什么?
什么是主要的差异class和struct 这个,为什么它以这样一种方式表现?
我正在研究使用异步内存流的解决方案,我正在考虑实现这种方法的正确方法.哪一个更方便?第一,简单:
//First approach: linear async
private async static Task WriteToStreamFirstVariant()
{
MemoryStream memoryStream = new MemoryStream();
byte[] data = new byte[256];
try
{
await memoryStream.WriteAsync(data, 0, data.Length);
}
catch(Exception exception)
{
//Handling exception
}
finally
{
memoryStream.Dispose();
}
}
Run Code Online (Sandbox Code Playgroud)
或者第二个嵌套任务和闭包?
//Second approach: nested tasks async
private async static Task WriteToStreamSecondVariant()
{
await Task.Run(async () =>
{
byte[] data = new byte[256];
using (MemoryStream memoryStream = new MemoryStream())
{
await memoryStream.WriteAsync(data, 0, data.Length)
.ContinueWith((Task writingTask) =>
{
//Handling exceptions
AggregateException exceptions …Run Code Online (Sandbox Code Playgroud) 在 Windows 窗体上开发解决方案时,我养成了向用户展示持续进展的习惯。我实现了带有连续进度条的简单虚拟窗口:

在解决方案树中,它与主窗口位于同一级别:

在做某事时显示持续进展的最简单的工作方法是以下代码。它确实有效:
//This method works
private void DoSomeBackgroundStuffWithShow()
{
ContinuousProgressWindow continuousProgressWindow =
new ContinuousProgressWindow();
BackgroundWorker backgroundWorker = new BackgroundWorker();
backgroundWorker.DoWork += (sender, arguments) =>
{
//Do some stuff for 4 seconds
Thread.Sleep(4000);
};
backgroundWorker.RunWorkerCompleted += (sender, arguments) =>
{
//Window is closed when needed. Great!
continuousProgressWindow.Dispose();
};
continuousProgressWindow.Show(this);
backgroundWorker.RunWorkerAsync();
}
Run Code Online (Sandbox Code Playgroud)
但我需要这个窗口出现在最上面并在工作时阻止其父窗口。以下代码非常相似,但不起作用 - 显示对话框,但从未关闭:
//This method DOES NOT WORK
private void DoSomeBackgroundStuffWithShowDialog()
{
ContinuousProgressWindow continuousProgressWindow =
new ContinuousProgressWindow();
BackgroundWorker backgroundWorker = …Run Code Online (Sandbox Code Playgroud) 假设我们有一个整数16.
是否有一个函数,它返回随机数组,组成它的总和?
例如7 1 2 4 1 1或1 5 2 3 6
我想知道是否存在一些在JavaScript中执行此操作的优雅方法.
c# ×5
.net-3.5 ×1
async-await ×1
asynchronous ×1
class ×1
delegates ×1
dialog ×1
inheritance ×1
interface ×1
javascript ×1
math ×1
memorystream ×1
oop ×1
struct ×1
this ×1
winforms ×1