在C#中调用方法时进行热身
我刚刚遇到这篇文章时间测量.我记得(我希望我不会误解)这是一场不公平的竞争,如果这种方法从未被调用.那就是: // At the beginning of the application MyClass instance = new MyClass(); instance.MyMethod(); instance.MyMethod(); // Faster than the first call, because now it's warmed up. 我们在C#中真的有如此热身的理论吗?如果是的,为什么( 解决方案 如果通过"热身",您指的是jit'ing,那么是 - 如果从未将其调用的方法尚未被编译,那么您第一次运行它可能会更慢. 另请参阅执行.NET CLR JIT编译每种方法,每次? 其他解决方案 这是由于时间(JIT)汇编而引起的.如果您想提高性能并避免这种效果,请本机图像生成器(ngen.exe)可以帮助您. 其他解决方案 人们在这里谈论的是 j
0 2023-05-23
编程技术问答社区
.Any()与.Count()>0哪个方法表现更好?
在System.Linq命名空间中,我们现在可以扩展我们的 iEnumerable的让 any() and count() 扩展方法. 我最近被告知,如果我想检查一个集合中包含1个或更多项目,我应该使用.Any()扩展方法而不是.Count() > 0扩展方法,因为.Count()扩展方法必须遍历所有项目. 其次,某些集合具有属性(不是扩展方法),即Count或Length.使用这些更好,而不是.Any()或.Count()? 是/nae? 解决方案 如果您是从具有.Length或.Count的东西开始不需要通过GetEnumerator()/MoveNext()/Dispose() Any()要求检查非exprenty IEnumerable序列所需的序列. 仅对于IEnumerable,然后Any()将通常更快,因为它只需要查看一种迭代即可.但是,请注意,Count()的LINQ-to-Objects实现确实检查ICollection
0 2023-05-23
编程技术问答社区
扩展方法在基本类型上不可用?
[可能的副本,但我没有找到它] 我惊讶地收到以下用法期间的错误'List' does not contain a definition for 'Sum'? using System; using System.Collections.Generic; using System.Text; using System.Linq; namespace Test { public class Foo: List { public int Total => base.Sum(); } } 似乎在继承后无法使用扩展方法?还是我错过了什么? P.S.我知道为什么不从列表中继承? 解决方案 理解此行为的关键是,与this,base本身相反,它不是表达式. base 关键字的c#规范( 11.7.13基本访问): 注意:与此不同,基础本身不是表达式.它是仅在base_access或构造函数_initiali
2 2023-05-23
编程技术问答社区
Scala 3中是否可以用扩展方法覆盖超类中的方法?
我尝试通过这样做来覆盖java.lang.object的等值方法: extension(cellTower: CellTower) // CellTower class unfortunately has no equals() implementation, // but a toString(), so we use this for equality def equals(other: Object): Boolean = cellTower.toString == other.toString 它没有用于平等(==). Scala 3扩展方法是不可能的,还是我做错了什么? 解决方案 这是不可能的:Object已经具有方法equals,所有参考类型扩展Object,因此编译器将始终采用被压制的java.lang.Object.equals,并且永远不要寻找任何扩展方法. 您示例的更完整版本看起来有点像这样: case
8 2023-05-22
编程技术问答社区
C#扩展方法--同时接受转义字符的字符串分割
我想为.NET字符串类编写一个扩展方法.我希望它是拆分方法的特殊变化 - 当分隔器之前使用逃生字符时,它采用逃生字符以防止串起字符串. 写这篇文章的最佳方法是什么?我很好奇最好的非regex方法. 具有签名的东西,例如... public static string[] Split(this string input, string separator, char escapeCharacter) { // ... } 更新: 因为这是一个评论,所以逃脱了... 在C#中逃脱非特殊字符时,您会收到错误-CS1009:未识别的逃生序列. 在IE jscript中,逃生角色被扔掉了.除非您尝试\ u,否则您会遇到"预期的十六进制数字"错误.我测试了Firefox,并且具有相同的行为. 我希望这种方法非常宽容并遵循JavaScript模型.如果您逃脱了非分离器,它应该"善待"删除逃生字符. 解决方案 怎么样: public static
0 2023-05-20
编程技术问答社区
有必要在R包中导出基础方法扩展吗?文档影响?
原则上,我可以保持这些扩展名不符合,这也使我可以对这些已经有充分文献记录的方法不添加冗余文档,而仍然没有任何报告的WARNING>. 有哪些缺点?是否建议在定义它们的软件包中将基本方法的扩展扩展?另外,如果没有导出某些核心方法扩展,这是否会使另一个软件包更难依赖我的? ? 例如,如果我不记录并且不导出以下内容: setMethod("show", "myPackageSpecialClass", function(object){ show(NA) }) 我正在尝试用名称空间和基本方法扩展来充实一些最佳实践的细节. 解决方案 如果您不导出方法,则用户(在命令行或试图通过Itimports中使用您自己的类和方法)将无法使用它们 - 您的类将用show,ANY-method. 显示 您不是在记录通用show,而是适合您的类的方法,show,myPackageSpecialClass-method.如果在您的命名空间中 import(methods)
12 2023-05-16
编程技术问答社区
如何为所有IEnumerable<Int32>重写ToString()方法?
我想在IEnumerable上覆盖ToString() 我正在考虑使用扩展方法. 但是,当我在下面这样做时,它仍然在System.Object上调用ToString().当我重命名我的方法时,然后调用我的方法. 由于我的扩展方法是在静态类中,因此我无法覆盖. 如何实现此目标,以便在List上调用.ToString()时,我的ToString()实现? public static class ExtensionMethods { public static new string ToString(this IEnumerable set) { var sb = new StringBuilder(); // Do some modifications on sb return sb.ToString(); } } 解决方案 如何实现此
2 2023-05-15
编程技术问答社区
如何重写ToString()并实现通用?
我有要进行以下更改的代码: 如何覆盖ToString()?它说:静态成员... toString(system.collections.generic.list)'不能标记为覆盖,虚拟或抽象. 我如何使其通用? public static override string ToString(this List list) { string output = ""; list.ForEach(item => output += item.ToString() + "," ); return output; } 谢谢! 解决方案 您想实现什么?我通常想输出列表的内容,因此我创建了以下扩展方法: public static string Join(this IEnumerable strings, string seperator) { return string.Join(seperator, str
4 2023-05-15
编程技术问答社区
用扩展方法重写(或影子)一个方法?
可能的重复: C#中有什么方法可以覆盖使用扩展方法的类方法? 有可能 Override shadow ( 解决方案 否.来自 msdn : 您可以使用扩展方法扩展类或接口,但不能覆盖它们.将永远不会调用具有相同名称和签名作为接口或类方法的扩展方法.在编译时,扩展方法的优先级总是低于类型本身定义的实例方法.
2 2023-05-15
编程技术问答社区
重写List<MyClass>的ToString()
我有一个类myllass,我想覆盖列表实例的方法: class MyClass { public string Property1 { get; set; } public int Property2 { get; set; } /* ... */ public override string ToString() { return Property1.ToString() + "-" + Property2.ToString(); } } 我想拥有以下内容: var list = new List { new MyClass { Property1 = "A", Property2 = 1 }, new MyClass { Property1 = "Z", Property2 = 2 },
2 2023-05-15
编程技术问答社区
在C#中是否有办法用扩展方法覆盖一个类的方法?
有时候我想用扩展方法覆盖类中的一种方法.有什么方法可以在C#? 中做到这一点 例如: public static class StringExtension { public static int GetHashCode(this string inStr) { return MyHash(inStr); } } 我想这样做的情况是能够将字符串的哈希人存储到数据库中,并使用使用字符串类的哈希(即字典,等)使用的所有类都使用相同的值. )由于内置的​​.NET哈希算法不能保证从一个版本的框架到下一个版本,因此我想用自己的框架替换. 还有其他情况,我遇到了我想使用扩展方法覆盖类方法的地方 我知道我可以通过划分现有类的方式来做到这一点,但是在很多情况下都可以使用扩展名进行操作非常方便. 解决方案 否;扩展方法永远不会优先于具有合适签名的实例方法,也切勿参与多态性(GetHashCode是virtual方法). 其他解决
0 2023-05-15
编程技术问答社区
获得一个通用方法,从运行时类型中推断出类型参数
我有一些抽象基类的扩展方法,可以说Pet本身都称为接收该类型参数的通用方法. public static Pet_ExtensionMethods { public static T PermuteFromData(this T thisPet, string data) where T : Pet { T newPet = new SomeDeserializer().Deserialize(data); newPet.someProperty = thisPet.someProperty; return newPet; } } 这对我来说很好,我可以说: Dog newDog = existingDog.PermuteFromData(dogData); Cat newCat = existingCat.PermuteFromData(catData); 以及所有具有相同基本实现的
0 2023-05-15
编程技术问答社区
如何在C#中重写字符串类的函数
例如,我需要查看字符串是否包含子字符串,所以我只能: String helloworld = "Hello World"; if(helloworld.Contains("ello"){ //do something } 但是,如果我有一系列项目 String helloworld = "Hello World"; String items = { "He", "el", "lo" }; 我需要在字符串类中创建一个函数,如果任何一个 数组中的项目包含在字符串中. 我想覆盖该函数包含(字符串),其中包含(iEnumerable)为此方案,而不是在另一类中创建函数.是否可以这样做,如果是这样,我们如何覆盖该功能?非常感谢. 所以这里是完整的解决方案(谢谢): public static bool ContainsAny(this string thisString, params string[] str) { return str.An
2 2023-05-15
编程技术问答社区
在Java中使用派生类型作为参数的方法重载
假设我有现有的代码,我想扩展,也避免尽可能多地更改它. 围绕此代码的某个地方有一种接收某种类型的方法. Engine.method(Base b) 现在,我想扩展此功能.因此,我将基础扩展到一种称为派生的类型,该类型拥有我需要的更多数据,并且还实现了另一种接收派生类型并对其做些不同的方法. Engine.method(Derived d) ,但我不想将原始调用更改为"方法".我以某种方式通过使用标志设法启动了正确的类型(基础或派生),但是由于原始调用是依据,因此我的新方法不会被调用. Base b = null; if(flag) { b = new Derived() } else{ b = new Base() } Engine.method(b) 问题是现在我的引擎(派生d)不会被调用.我通过使用铸造 对其进行了工作 if(flag) Engine.method((Derived)b) ,但这是错误和愚蠢的.有什么建议
0 2023-05-15
编程技术问答社区
延伸方法的解析与可忽略值类型的参数
public static class Extension { public static void Test(this DateTime? dt) { } } void Main() { var now = DateTime.Now; Extension.Test(now); // ok now.Test(); // compile time error } 我很好奇,为什么编译器在称为扩展时无法解析相同的方法? 解决方案 a DateTime是 C#规范,7.6.5.2扩展方法调用: 如果: MJ可访问且适用于参数作为静态方法,如上所述 隐含的身份,参考或拳击转换从Expr到MJ的第一个参数的类型. ... 如果在任何封闭名称空间声明或编译单元中都找不到候选人集,则会发生编译时间错误. 因此,您必须将DateTime施放到Nullable> Nullable
0 2023-05-15
编程技术问答社区
VB.NET编译器如何选择运行哪个扩展重载?
有一个有趣的奇怪性 - 认为某人可能会提供帮助. 这是从这个问题中使用的一些有趣类型的乐趣: 如何检查对象是否可用? Option Strict On Module Test ' Call this overload 1 Function IsNullable(obj As ValueType) As Boolean Return False End Function ' Call this overload 2 Function IsNullable(Of T As {Structure})(obj As Nullable(Of T)) As Boolean Return True End Function Sub Test() ' a is an integer! Dim a As Integer = 123 ' callin
0 2023-05-15
编程技术问答社区
检查Swift字典扩展中的nil值
我在操场文件中有以下代码: extension Dictionary { func test() { for key in self.keys { self[key] } } } var dict: [String: AnyObject?] = [ "test": nil ] dict.test() 我从此以后将指向for-EAPE循环中的线作为输出,因为它是相关的.在此特定实例中,输出为nil. 当我更改for-each循环时,看起来像这样: for key in self.keys { print(self[key]) } 输出为"Optional(nil)\n". 我真正想做的是检查零值,但代码: for key in self.keys { self[key] == nil } 输出false. 我尝试的另一件事是以下内容:
0 2023-05-12
编程技术问答社区
原始类型上的Swift扩展的性能
我想知道swift中的以下内容是否会有任何性能差异: let x = 42.42 print(floor(x)) 和 let x = 42.42 extension Double { func myFloor() -> Double { return floor(self) } } print(x.myFloor()) 解决方案 编译器在第二种情况下嵌入了代码并产生相同的机器代码. 您可以自己看到,这里.
0 2023-05-12
编程技术问答社区