.Net库中的许多方法都是在本机代码中实现的.那些来自框架本身的标记着[MethodImpl(MethodImplOptions.InternalCall)].来自某些非托管DLL的那些标记有[DllImport](例如[DllImport("kernel32.dll")]).到目前为止没有什
但在为另一个问题写答案时,我发现有许多标记的方法[DllImport("QCall")].它们似乎是.Net的内部实现(例如GC._Collect()).
我的问题是:究竟是什么[DllImport("QCall")]意思?[DllImport("QCall")]和之间有什么区别[MethodImpl(MethodImplOptions.InternalCall)]?
在.NET中,某些字符串不是这样的:
static void CompareBug()
{
string x = "\u002D\u30A2"; // or just "-?" if charset allows
string y = "\u3042"; // or just "?" if charset allows
Console.WriteLine(x.CompareTo(y)); // positive one
Console.WriteLine(y.CompareTo(x)); // positive one
Console.WriteLine(StringComparer.InvariantCulture.Compare(x, y)); // positive one
Console.WriteLine(StringComparer.InvariantCulture.Compare(y, x)); // positive one
var ja = StringComparer.Create(new CultureInfo("ja-JP", false), false);
Console.WriteLine(ja.Compare(x, y)); // positive one
Console.WriteLine(ja.Compare(y, x)); // positive one
}
Run Code Online (Sandbox Code Playgroud)
你看,x它严格地大于y,并且y严格地大于x.
因为 …
在我问的另一个问题中,出现了一条评论,表明.NET框架的Array.Copy方法使用了非托管代码.我用Reflector挖掘并发现Array.Copy方法重载的签名之一定义如下:
[MethodImpl(MethodImplOptions.InternalCall), ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
internal static extern void Copy(Array sourceArray, int sourceIndex, Array destinationArray, int destinationIndex, int length, bool reliable);
Run Code Online (Sandbox Code Playgroud)
看了这个之后,我有点困惑.我混淆的来源是extern修饰符,意思是(MSDN链接):
extern修饰符用于声明从外部实现的方法.
但是,方法声明也用一个MethodImplOptions.InternalCall属性来装饰,它表示(MSDN链接):
指定内部调用.内部调用是对在公共语言运行时本身内实现的方法的调用.
任何人都可以解释这个看似明显的矛盾吗?
我正在摆弄C#中的解析,发现对于我尝试过的每一个字符串,string.StartsWith("\u2D2D")都会返回true.这是为什么?
它似乎适用于每个char.用.Net 4.5尝试了这个代码,Debugger没有破解.
for (char i = char.MinValue; i < char.MaxValue; i++)
{
if(!i.ToString().StartsWith("\u2d2d"))
{
Debugger.Break();
}
}
Run Code Online (Sandbox Code Playgroud) 有人可以解释这种行为吗?
" ".EndsWith(((char)9917).ToString()) // returns true
Run Code Online (Sandbox Code Playgroud)
StartsWith的作品相同.
检查下面的更新3 我发现我遇到的问题与.Net 4.0,4.0客户端和4.5的c#字符串比较器的已知严重问题有关,这将导致字符串列表的排序顺序不一致(导致输出依赖在输入的顺序和使用的排序算法).该问题于2012年12月向微软报告,并以"不会修复"结束.可以使用一种解决方法,但速度慢得多,对于大型集合来说几乎不实用.
在实现不可变的PatriciaTrie时,我想将其性能与System.Collections.Generic.SortedList进行比较.我使用以下文件https://github.com/rkapsi/patricia-trie/blob/master/src/test/resources/org/ardverk/collection/hamlet.txt来创建用于测试的输入词表.
当使用Comparer<string>.Default或StringComparer.InvariantCulture作为密钥比较器插入c#SortedList中的每个单词时,使用常规搜索方法无法检索成功插入的多个条目(例如,ContainsKey返回false),但密钥在列表中显示为通过迭代列表观察.
更奇怪的是,比较器在将从排序列表中检索到的密钥与无法找到的搜索密钥进行比较时返回值"0" ContainsKey.
下面的完整示例演示了我的系统上的这个问题.
using System;
using System.IO;
using System.Linq;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
// the problem is possibly related to comparison.
var fail = true;
var comparer = fail ? StringComparer.InvariantCulture : StringComparer.Ordinal;
// read hamlet (contains duplicate words)
var words = File
.ReadAllLines("hamlet.txt")
.SelectMany(l => l.Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries))
.Select(w => w.Trim())
.Where(w => !string.IsNullOrEmpty(w))
.Distinct(comparer) …Run Code Online (Sandbox Code Playgroud) c# ×5
.net ×3
dllimport ×1
internals ×1
sortedlist ×1
sorting ×1
startswith ×1
string ×1
unicode ×1