我想验证多个参数并抛出一个ArgumentNullException如果其中任何一个null。为了便于讨论,我们假设我有这个:
public void DoSomething(SomeClass param1, SomeClass param2, SomeClass param3);
Run Code Online (Sandbox Code Playgroud)
当然,我可以这样做:
if (param1 == null)
throw new ArgumentNullException(nameof(param1));
if (param2 == null)
throw new ArgumentNullException(nameof(param2));
if (param3 == null)
throw new ArgumentNullException(nameof(param3));
Run Code Online (Sandbox Code Playgroud)
但它并不是特别漂亮,特别是如果它是在整个应用程序中反复检查的话。所以,我想我会这样做:
public static class ValidationExtensions
{
public static void NullCheck<T>(this T subject)
{
if (T == null)
throw new ArgumentNullException();
}
}
// ...
param1.NullCheck();
param2.NullCheck();
param3.NullCheck();
Run Code Online (Sandbox Code Playgroud)
但这样我就失去了nameof。我做不到nameof(subject),因为那毫无意义。
当然,这是一个选择:
public static class ValidationExtensions
{
public static void NullCheck<T>(this T subject, string …Run Code Online (Sandbox Code Playgroud) 在我看来,C# 8.0 特性,默认接口成员实现,本质上允许在接口级别创建实现。结合一个类可以实现多个接口的事实,它似乎非常接近类的多重继承结构。据我了解,这似乎与语言设计的核心背道而驰。
这种差异来自哪里,这为实际的抽象类留下了什么空间?
这个问题已被建议作为我的答案,虽然它很有用,但并不能完全回答我的问题。更准确地说:
嗨,大家好,我是一名初学计算机工程师,我有一点问题.
我正在尝试比较两个不同大小的列表(列表A和列表B)并生成一个新的列表(列表C),其大小与列表A相同,包含C#中两个列表的匹配结果.在这里 - 让我以一个例子来解释.
例如,有这两个列表:
list A: "1", "2", "3", "4", "5", "6"
list B: "1", "4", "5"
Run Code Online (Sandbox Code Playgroud)
我想要这个结果:
list C: "1", "null", "null", "4", "5", "null"
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经尝试过这段代码:
List<string> C = new List<string>();
// nA is the length of list A & nB is the length of list B
for (int x = 0; x < nA; x++)
{
for (int y = 0; y < nB; y++)
{
if (listA[x] == listB[y])
{
listC.Add(lista[x]);
}
else
listC.Add(null);
}
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试做我的第一个 TypeScript/React 项目,但遇到了问题。
使用这个答案,我设法从我的麦克风读取和播放声音,并在控制台中显示一些样本分析数据。现在我正在尝试将其翻译成 TS。一步一步来,我已经到了这个:
export class Processor {
readonly BUFFER_SIZE = 16384;
audioContext: AudioContext;
gainNode: GainNode;
microphoneStream: MediaElementAudioSourceNode;
constructor() {
this.audioContext = new AudioContext();
console.log('audio is starting up ...');
if (navigator.getUserMedia) {
navigator.getUserMedia(
{ audio: true },
function (stream) {
startMicrophone(stream);
},
function (e) {
alert('Error capturing audio.');
});
} else {
alert('Seems like this browser might not be supported.');
}
}
private startMicrophone(stream: MediaStream) {
this.gainNode = this.audioContext.createGain();
this.gainNode.connect(this.audioContext.destination);
this.microphoneStream =
this.audioContext.createMediaStreamSource(stream);
}
}
Run Code Online (Sandbox Code Playgroud)
除了调用 startMicrophone …