C#5.0自2012年8月开始推出.我在哪里可以找到规格?他们已经停止了ECMA规范,但MSDN怎么样?
我最近在使用Array.SetValue(Int32)方法时在C#中遇到了异常.例外是:
无法从源类型扩展到目标类型,因为源类型不是基本类型或无法完成转换.
对"原始"这个词的引用让我感到有些惊讶,因为我认为倾向于将这些类型称为内置类型,而"原始类型"一词也是一个非正式术语."原始"类型和"内置值类型"之间有什么区别?我没有在C#语言规范中找到原始类型的定义.
以下是讨论的示例代码(考虑爬虫"是"动物和哺乳动物"是"动物也是如此")
Animal[] reptiles = new Reptile[]
{ new Reptile("lizard"), new Reptile("snake") };
Animal[] animals = new Animal[]
{ new Reptile("alligator"), new Mammal("dolphin") };
try
{
Array.ConstrainedCopy(animals, 0, reptiles, 0, 2);
}
catch (ArrayTypeMismatchException atme)
{
Console.WriteLine('[' + String.Join<Animal>(", ", reptiles) + ']');
}
Run Code Online (Sandbox Code Playgroud)
当我运行此代码时,我得到一个ArrayTypeMismatchException,带有注释
Array.ConstrainedCopy仅适用于可证明兼容的数组类型,不会对每个数组元素进行任何形式的装箱,拆箱,加宽或转换.更改数组类型(即,将Derived []复制到Base []),或者在CER for Array.Copy不太强大的可靠性契约中使用缓解策略,例如克隆数组或丢弃可能损坏的目标数组.
但是,当我看到MSDN时,我看到这个方法也引发了一个问题InvalidCastException.投掷的条件InvalidCastException是:
sourceArray中至少有一个元素无法强制转换为destinationArray类型.
所以,我很为难,怎么做你得到一个InvalidCastException了这种方法,如果因为它规定永远不会有一个数组元素的任何铸造?
在Java中,类Arrays中大约有18个静态"填充"方法,用于为数组中的每个元素分配一个值.我正在寻找C#中的等价物以实现同样的目的,但我找不到具有相同紧凑性的任何东西:
1)ForEach,因为我理解通过值传递数组中的元素,所以我不能更改它们
2)从Enumerable重复创建一个新数组,创建一个新数组然后从数组中复制每个元素似乎是开销
3)for循环并不漂亮,我想这就是为什么Java人员开始介绍这个紧凑的符号
4)Array类中的Clear方法可以将所有内容都设置为零,但是如何将零转换为我想要的非零值?
要演示Java的语法,请考虑此代码打印数字7的三倍:
int[] iii = {1, 2, 3};
Arrays.fill(iii, 7);
for (int i : iii) {
System.out.println(i);
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试提高WPF业务应用程序的响应能力,以便当用户在服务器响应之后等待新屏幕出现的"屏幕之间"屏幕时,他们仍然可以输入数据.我能够对事件进行排队(在后台面板上使用PreviewKeyDown事件处理程序),但是当我加载时,我很难将新事件中的事件抛出.特别是新面板上的TextBoxes没有拾取文本.我已尝试提升相同的事件(在捕获它们时将Handled设置为true,再次提升时将Handled设置为false)创建新的KeyDown事件,新的PreviewKeyDown事件,执行ProcessInput,在面板上执行RaiseEvent,将焦点设置在右侧TextBox和TextBox上的RaiseEvent做了很多事情.
看起来应该很简单,但我无法弄明白.
以下是我尝试过的一些事情.考虑一个名为EventQ的KeyEventArgs队列:
这是一件不起作用的事情:
while (EventQ.Count > 0)
{
KeyEventArgs kea = EventQ.Dequeue();
tbOne.Focus(); // tbOne is a text box
kea.Handled = false;
this.RaiseEvent(kea);
}
Run Code Online (Sandbox Code Playgroud)
这是另一个:
while (EventQ.Count > 0)
{
KeyEventArgs kea = EventQ.Dequeue();
tbOne.Focus(); // tbOne is a text box
var key = kea.Key; // Key to send
var routedEvent = Keyboard.PreviewKeyDownEvent; // Event to send
KeyEventArgs keanew = new KeyEventArgs(
Keyboard.PrimaryDevice,
PresentationSource.FromVisual(this),
0,
key) { RoutedEvent = routedEvent, Handled = false };
InputManager.Current.ProcessInput(keanew);
}
Run Code Online (Sandbox Code Playgroud)
而另一个: …
C#语言规范的附录A涉及文档注释,它指出有两种形式:
single-line-doc-comment:
/// input-charactersopt
delimited-doc-comment:
/**delimited-comment-textopt*/
有偏好吗?我注意到倾向于选择单行文档评论格式,但我不知道除了人们从美学观点选择之外是否存在技术或实践原因.
我还在Jones和Freeman的"C#for Java Developers"一书中读到了以下内容:
代码文档注释前面有三个正斜杠,如下所示:
/// A single line documentation comment.
C#规范还建议使用熟悉的/**标记来标识多行文档注释.但是,C#编译器的7.00版本不支持此语法.
我一直无法验证csc的最新版本是否与多行语法不兼容.据我所知,这种语法运行得很好.
**edit**有人要求展示样品.这是样本:
/// <summary>
/// Performs a Method1 calculation on two strings
/// </summary>
/// <param name="arg1">The first string</param>
/// <param name="arg2">The second string</param>
/// <returns>The number 3</returns>
public static int Method1(String arg1, String arg2)
{
return 3;
}
/**
* <summary>
* Performs a Method2 calculation on two strings
* </summary>
* <param name="arg1">The first string</param>
* <param name="arg2">The second …Run Code Online (Sandbox Code Playgroud) 有没有办法轻易地平铺mdi父母的所有形式的孩子?我正在寻找Windows提供的大部分功能,平铺级联.有人知道一个简单的方法吗?
在MSDN上他们写
可以通过对其应用OptionalFieldAttribute属性将字段标记为可选字段.在反序列化期间,如果缺少可选数据,序列化引擎会忽略缺席并且不会抛出异常.
我无法得到例外.我试图创建一个类,用SerializableAttribute标记它,用BinaryFormatter序列化一个对象并将状态保存到磁盘上的文件,然后在我的类中添加两个字段,我没有用OptionalFieldAttribute标记,并试图反序列化对象回来,我只是坚持到磁盘.我很惊讶没有抛出异常?
方法
public static int binarySearch(Object[] a, Object key)
Run Code Online (Sandbox Code Playgroud)
在其实现中的Arrays类导航通过abinarySearch算法之后的数组参数,并将ainto 的元素转换为Comparableinvokes,compareTo(key)直到它找到匹配或耗尽可能性.
然而,我对实现感到困惑,如果是这种情况,方法将始终将元素强制转换为Comparable,并且ClassCastException如果它遇到未实现的元素,则会抛出一个,如果ComparableAPI用户不熟悉该方法将只考虑数组元素的比较器,而不是密钥的比较器,通过防止在数组类型与Comparable不兼容的情况下进行调用的编译更加万无一失,并且如果执行调用也更有效该方法定义为
public static int binarySearch(Comparable[] a, Object key)
Run Code Online (Sandbox Code Playgroud)
?将第一个参数定义为Object数组有什么好处?
编辑我在发布问题之后才看到这个问题并且已经回答但是这里有一个相关的帖子:为什么Arrays.sort采用Object []而不是Comparable []?他们声明,如果方法采用参数(Comparable [],Object),就不可能将Object []类型的数组传递给该方法,而不需要"重新分配",这也很昂贵.