您可能知道,C#中的数组实现IList<T>了其他接口.但不知何故,他们这样做没有公开实现Count属性IList<T>!数组只有一个Length属性.
这是一个明显的例子,C#/ .NET打破了自己关于接口实现的规则,还是我错过了什么?
在JavaScript中,我们有两种方法可以创建"类"并赋予它公共功能.
方法1:
function MyClass() {
var privateInstanceVariable = 'foo';
this.myFunc = function() { alert(privateInstanceVariable ); }
}
Run Code Online (Sandbox Code Playgroud)
方法2:
function MyClass() { }
MyClass.prototype.myFunc = function() {
alert("I can't use private instance variables. :(");
}
Run Code Online (Sandbox Code Playgroud)
我读了很多次,人们说使用方法2效率更高,因为所有实例共享相同的函数副本而不是每个实例都有自己的副本.通过原型定义函数有一个巨大的缺点 - 它使得无法拥有私有实例变量.
即使理论上,使用方法1给对象的每个实例赋予它自己的函数副本(因此使用更多的内存,更不用说分配所需的时间) - 实际上实际发生了什么?似乎优化Web浏览器可以很容易地识别这种非常常见的模式,并且实际上让对象的所有实例引用通过这些"构造函数"定义的相同函数副本.然后,如果稍后显式更改,它只能为实例提供自己的函数副本.
关于两者之间的性能差异的任何见解 - 或甚至更好的现实世界经验 - 都将非常有帮助.
目前是否可以在TypeScript中的类上实现索引器?
class MyCollection {
[name: string]: MyType;
}
Run Code Online (Sandbox Code Playgroud)
这不编译.当然,我可以在接口上指定索引器,但是我需要这种类型的方法以及索引器,因此接口是不够的.
谢谢.
我经常编写C#代码,必须使用魔术字符串来表达属性名称.每个人都知道魔术弦的问题.它们很难重构,它们没有编译时检查,并且通常会导致难以诊断的问题.然而,C#/ .NET 在整个地方使用它们来表示属性/类/方法名称.
这个问题已持续多年和多年,目前唯一可行的解决方案是使用表达式树,然后在运行时解析属性名称.这使您获得令人满意的编译时检查,但它使代码复杂化(需要Expression类型的参数),并且会产生运行时成本.
有没有人知道是否有一个特性考虑因为C#/ .NET添加编译时反射来克服这个普遍存在的问题?
看起来这将是一个简单的补充,它将是一个非破坏性的变化,它将使许多开发人员受益匪浅.typeof()运算符已经执行了编译时反射的形式,因此看起来运算符nameof()(或类似的东西)将非常互补.
此外,有没有人知道这个功能的任何潜在问题?
谢谢您的帮助.
我刚刚遇到了一个很棒的"功能",如果有足够的小数位,.NET 默认会Double.ToString()使用科学记数法.
.005.ToString() // ".005"
.00005.ToString() // "5E-05"
Run Code Online (Sandbox Code Playgroud)
有没有人知道一种有效的方法让它以标准(非科学)符号显示为字符串?
我已经看到了这个问题,但是前两个答案对我来说似乎有些苛刻,因为他们都做了Double.ToString(),然后只是重新格式化结果.
谢谢你的帮助.
编辑:
所需的输出:
.00005.ToString() == ".00005"
Run Code Online (Sandbox Code Playgroud)
EDIT2:
所有重复和结束投票是什么?我在问题中特别说,类似的问题没有令人满意的答案.这个网站上的人太高兴了.
我的解决方案
如果它对任何人都有用:
/// <summary>
/// Converts the double to a standard notation string.
/// </summary>
/// <param name="d">The double to convert.</param>
/// <returns>The double as a standard notation string.</returns>
public static String ToStandardNotationString(this double d)
{
//Keeps precision of double up to is maximum
return d.ToString(".#####################################################################################################################################################################################################################################################################################################################################");
}
Run Code Online (Sandbox Code Playgroud)
注意:这仅适用于值> 1.我还没有找到一种有效的方法来为所有值执行此操作.
我使用Database First在Entity Framework中映射了一些存储过程.它创建强类型方法,您可以调用它们来运行存储过程.但是,我遇到了一个重大问题,因为我没有看到任何方法来调用它使用存储过程中定义的默认参数创建的这些方法.这意味着:
a)如果默认参数值要改变,我必须手动将默认参数添加到方法调用中,这是脆弱的.
b)手动写入方法重载.这基本上消除了首先从数据库生成模型的好处.
有谁知道这个问题是否有更好的解决方案?
谢谢.
C#团队之前曾考虑过向C#添加扩展属性,事件等.
Per Eric Lippert:
http://blogs.msdn.com/b/ericlippert/archive/2009/10/05/why-no-extension-properties.aspx
然而,要使这些特征有用,它们必须能够用对象存储一些新的状态.看起来这样做的唯一方法是使用字典并将对象的每个实例与其他状态相关联.
如果可以通过创建我自己的字典(以及可能的get/set扩展方法)"手动"复制此功能将是有用的.但是,为了将对象的特定实例与某个状态相关联,您需要散列对该对象的实际引用.在另一种语言中,您可以通过散列其内存位置来实现此目的,但是在C#中不能保证保持不变,并且使用不安全代码来完成此功能远非理想.
有没有人知道是否有可能获得一些对象的可散列引用,该对象在对象的内部状态发生变化时不会发生变化?显然有一些内部机制可以跟踪单个对象而不管它们的内存位置如何,但我不确定它是否暴露给用户代码.
注意:简单地散列对象本身根本不起作用,因为GetHashCode()取决于对象的内部状态而不是它在哪个对象上.
感谢您的任何见解.
罗斯林CTP已经出现了一段时间了,我很喜欢玩它一点,但有一个明显的问题,我还没有看到答案.Roslyn将为调试带来哪些好处(如果有的话)?
任何花时间在Visual Studio中进行严格调试的人都知道在调试期间不能使用lambda表达式以及LINQ是多么令人沮丧.鉴于Roslyn是一个编译器即服务,是否可以使调试(监视窗口/即时窗口)支持这些功能?
感谢任何有见识的人.
编辑:
更具体地说,以下文章详细说明了为什么lambdas目前无法在immediate/watch窗口中使用.
是否知道Roslyn是否专门解决了本文详述的问题?
在标题中,没有人知道是否有在.NET的地方,或第三方库,其中的整数可以转换为自己的"排序"同行.
1 - first
2 - second
3 - third
etc...
Run Code Online (Sandbox Code Playgroud)
我当然可以自己写一个,但如果可能的话,我宁愿重用已经存在的东西.
谢谢.
在Java中,final意味着变量只能分配一次,但该分配可以在程序中的任何位置进行.在C#中,readonly意味着只能在构造函数中分配一个字段,IMO对它的用处非常少.
众所周知,C#受Java设计的影响很大,但这种差异一直让我感到非常奇怪.有没有人知道CLR中是否存在技术原因导致C#readonly与Java的行为不太有用final?
编辑:
回应评论; 我想指出,我很清楚不变性的好处,而且我在整个地方都使用它.我相信readonly没有Java那么有用,因为:
public class Foo
{
private readonly int _bar;
Foo()
{
_bar = 5;
}
}
Run Code Online (Sandbox Code Playgroud)
哎呀,我实际上需要在辅助方法中初始化该值!
public class Foo
{
private readonly int _bar;
Foo()
{
initialize()
}
private void initialize()
{
_bar = 5; //Can't compile because of semantics of readonly
}
}
Run Code Online (Sandbox Code Playgroud) c# ×8
.net ×7
arrays ×1
class ×1
clr ×1
compile-time ×1
debugging ×1
dictionary ×1
double ×1
indexer ×1
interface ×1
javascript ×1
list ×1
magic-string ×1
performance ×1
prototype ×1
readonly ×1
reference ×1
roslyn ×1
sql-server ×1
state ×1
tostring ×1
typescript ×1