为了彻底解释,这个问题已经彻底改革.
我注意到C#6.0中空传播运算符的限制似乎很差,因为你无法针对已经传播的对象调用属性设置器(尽管你可以针对已经传播的对象调用属性getter) .正如您将从生成的IL (我已反映到C#中)看到的那样,没有任何东西可以限制使用空传播调用属性设置器的能力.
首先,我创建了一个简单的类,包括Java样式的Get/Set方法和具有公共getter/setter访问权限的属性.
public class Person
{
public Person(string name, DateTime birthday)
{
Name = name;
}
public string Name { get; set; }
public void SetName(string name)
{
Name = name;
}
public string GetName()
{
return Name;
}
}
Run Code Online (Sandbox Code Playgroud)
我已经在下面的测试类中测试了空传播的能力.
public class Program
{
public static void Main(string[] args)
{
Person person = new Person("Joe Bloggs", DateTime.Parse("01/01/1991"));
// This line doesn't work - see documented error below
person?.Name = "John Smith"; …Run Code Online (Sandbox Code Playgroud) 我有一些代码,我目前正在优化多核架构中的并发性.在我的一个类中,我发现了一个嵌套foreach循环.基本上,外部循环遍历一个NetworkInterface对象数组.内循环通过网络接口IP地址进行迭代.
它让我思考,嵌套Parallel.ForEach循环一定是个好主意吗?阅读本文后(同一列表上的嵌套Parallel.ForEach循环?)我仍然不确定在效率和并行设计方面适用的是什么.此示例将Parallel.Foreach处理应用于列表的语句,其中两个循环都在该列表上执行操作.
在我的例子中,循环正在做不同的事情,所以,我应该:
给定一组数字,生成所有唯一对.
例如,给定[ 1, 2, 3, 4, 5 ]唯一的数字对将是:
(1, 2), (1, 3), (1, 4), (1, 5)
(2, 3), (2, 4), (2, 5)
(3, 4), (3, 5)
(4, 5)
Run Code Online (Sandbox Code Playgroud)
我的解决方案如下:
int[] numbers = new int[] { 1, 2, 3, 4, 5 };
HashSet<Pair> pairs = new HashSet<Pair>();
for(int i = 0; i < numbers.Length; i++)
{
for(int j = i + 1, j < numbers.Length; j++)
{
pairs.Add(new Pair(numbers[i], numbers[j]));
}
}
Run Code Online (Sandbox Code Playgroud)
我认为时间复杂度看起来像O(n 2 - 1)减去1,因为迭代j总是比1短 …
在.NET 中使用dynamicvs 的性能成本是object多少?比方说,我有一个接受任何类型参数的方法.例如
public void Foo(object obj)
{
}
Run Code Online (Sandbox Code Playgroud)
要么
public void Foo(dynamic obj)
{
}
Run Code Online (Sandbox Code Playgroud)
ILSpy告诉我,在使用动态代码时,编译器必须插入代码块来处理动态.因此,我想知道是否建议使用动态代替对象,以及这种用法以性能为代价达到什么级别?
我目前正在为JavaScript构建一个API,主要使用Visual Studio 2010和JetBrains WebStorm(如果您正在寻找一个防弹JavaScript IDE,那就太棒了).
虽然通过Visual Studio中的智能感知列表中寻找(尝试使用JavaScript API来熟悉自己),我注意到,这两个Document和document存在.
Document和之间有什么区别document?document(如果有的话)的实例?Document(因为它不是一个函数,因此,不可构造)?Document使其可以构建的危害是什么?这些问题背后的理由是,我要创建适合我的API一些对象(例如; Document,HTMLElement等),但这些似乎在某些方面已经存在了,我不相信,我应该重写他们的母语实现.
考虑以下代码(为了这个测试,它没有做任何特殊用途 - 它只是为了演示发生的错误)
Dictionary<string, dynamic> d = new Dictionary<string, dynamic>()
{
{ "a", 123 },
{ "b", Guid.NewGuid() },
{ "c", "Hello World" }
};
d.Where(o => o.Key.Contains("b")).ForEach(i => Console.WriteLine(i.Value));
//retuns the Guid value, as expected.
Run Code Online (Sandbox Code Playgroud)
我想Dictionary<string, dynamic>使用继承包装:
public class CustomDictionary : Dictionary<string, dynamic>
{
}
Run Code Online (Sandbox Code Playgroud)
以下是使用此派生类的上述检查:
CustomDictionary d = new CustomDictionary()
{
{ "a", 123 },
{ "b", Guid.NewGuid() },
{ "c", "Hello World" }
};
d.Where(o => o.Key.Contains("b")).ForEach(i => Console.WriteLine(i.Value));
Run Code Online (Sandbox Code Playgroud)
有时候是这样的...


关于导致问题的原因或如何解决问题的任何想法?
我被教导结构应该几乎总是不可变的,因此记录类与记录结构的这种不寻常行为让我措手不及。
使用记录类...
record class Person(string FirstName, string LastName);
Person p = new("John", "Smith");
p.FirstName = "Jack" // Not allowed!
Run Code Online (Sandbox Code Playgroud)
使用记录结构...
record struct Person(string FirstName, string LastName);
Person p = new("John", "Smith");
p.FirstName = "Jack" // Fine!
Run Code Online (Sandbox Code Playgroud)
使用只读记录结构...
readonly record struct Person(string FirstName, string LastName);
Person p = new("John", "Smith");
p.FirstName = "Jack" // Now allowed!
Run Code Online (Sandbox Code Playgroud)
为什么非readonly记录结构默认是可变的,为什么相同的行为不适用于记录类?
编辑:我想我在这里问的是,为什么语法......很奇怪?
例如,看起来更合乎逻辑:
record class-具有值语义的可变引用类型。readonly record class-具有值语义的不可变引用类型。record struct-具有值语义的可变值类型。readonly record struct …我已经阅读了一些文章,建议在JavaScript中扩展内置对象是一个坏主意.比方说我添加一个first函数Array...
Array.prototype.first = function(fn) {
return this.filter(fn)[0];
};
Run Code Online (Sandbox Code Playgroud)
太好了,所以现在我可以根据谓词得到第一个元素.但是当ECMAScript-20xx决定首先添加到规范并以不同方式实现时会发生什么? - 好吧,突然之间,我的代码假定了一个非标准的实现,开发人员失去信心等等.
那么我决定创建自己的类型......
var Enumerable = (function () {
function Enumerable(array) {
this.array = array;
}
Enumerable.prototype.first = function (fn) {
return this.array.filter(fn)[0];
};
return Enumerable;
}());
Run Code Online (Sandbox Code Playgroud)
所以现在,我可以将一个数组传递给一个新的Enumerable,然后在Enumerable实例上调用它.大!我尊重ECMAScript-20xx规范,我仍然可以做我想做的事情.
然后发布了ES20XX + 1规范,它引入了Enumerable一种甚至没有第一种方法的类型.现在发生了什么?
本文的关键归结为此; 扩展内置类型有多糟糕,以及我们如何在将来避免实现冲突?
注意:命名空间的使用可能是解决这个问题的一种方法,但话说回来,它不是!
var Collection = {
Enumerable: function () { ... }
};
Run Code Online (Sandbox Code Playgroud)
当ECMAScript规范引入时会发生什么Collection?
在我的application.properties文件中,我有......
server.port=8086
server.connection-timeout=15000
Run Code Online (Sandbox Code Playgroud)
我知道文件正在正确加载,因为服务器在端口8086上运行.
在应用程序中,我有一个 RestController
@RestController
class TestController {
@GetMapping()
fun getValues(): ResponseEntity<*> {
return someLongRunningProcessPossiblyHanging()
}
}
Run Code Online (Sandbox Code Playgroud)
当我调用端点时,请求永远不会超时,它只是无限期挂起.
我错过了什么吗?
注意:我也被告知Tomcat在几分钟内使用此字段,而不是毫秒(相当不寻常的选择IMO).我已经尝试将其设置为server.connection-timeout=1表示1分钟,但这也不起作用.
注意:我不希望另一个 HTTP请求导致先前的请求超时,我希望每个HTTP请求自己超时,如果过多的时间过去服务请求.
可能重复:
扩展方法与静态实用程序类
我正在构建一个通用函数的API,它根据.NET中的对象执行操作.例如; 我创建了一个函数来检查字符串以查看它是否是电子邮件地址.
我可能有:
static bool IsEmailAddress(string text)
{
return IsMail(text);
}
Run Code Online (Sandbox Code Playgroud)
或者我可以创建一个像这样使用的扩展方法:
string text = "HelloWorld@Email.com";
if (text.IsEmailAddress())
{
}
Run Code Online (Sandbox Code Playgroud)
哪个更合适,或者你认为既然这是一个通用的库,我可以在技术上实现它两种方式,并允许开发人员决定哪个最适合他们?
c# ×7
.net ×3
javascript ×2
performance ×2
algorithm ×1
c#-6.0 ×1
concurrency ×1
dom ×1
dynamic ×1
helper ×1
immutability ×1
inheritance ×1
java ×1
kotlin ×1
linq ×1
record ×1
spring ×1
spring-boot ×1