如果.NET 4.0可执行文件包含对.NET 2.0程序集的引用,.NET 4.0运行时到底做了什么?
.NET 2.0程序集是否与.NET 4.0运行时一起运行(换句话说,.NET 4.0必须与.NET 2.0 100%API兼容),或者该进程是否以某种方式托管.NET 2.0运行时,并且会发生一些神奇的事情.基于.NET 4.0的代码可以透明地访问.NET 2.0类型吗?
WebRequest request = HttpWebRequest.Create(url);
var credentialCache = new CredentialCache();
credentialCache.Add(
new Uri(url), // request url
"Digest", // authentication type
new NetworkCredential("user", "password") // credentials
);
request.Credentials = credentialCache;
Run Code Online (Sandbox Code Playgroud)
但是,这仅适用于没有URL参数的URL.例如,我可以下载http://example.com/test/xyz.html
得很好,但是当我尝试下载时http://example.com/test?page=xyz
,结果是400 Bad Request消息,服务器日志中包含以下内容(运行Apache 2.2):
Digest: uri mismatch - </test> does not match request-uri </test?page=xyz>
Run Code Online (Sandbox Code Playgroud)
我的第一个想法是摘要规范要求从摘要哈希中删除URL参数 - 但是从传递给的URL中删除参数credentialCache.Add()
并没有改变事物.所以它必须是相反的方式,在.NET框架中的某个地方错误地从URL中删除参数.
假设我有两个类,第一个用于写入原语类型(bool
,int
,float
等等),第二个延伸的第一到也写复杂类型:
struct Writer {
virtual void Write(int value) = 0;
};
struct ComplexWriter : public Writer {
template <typename TValue> void Write(const TValue &value) {
boost::any any(value);
Write(any);
}
//virtual void Write(int value) = 0; // see question below
virtual void Write(const boost::any &any) = 0;
};
Run Code Online (Sandbox Code Playgroud)
这个想法是,如果有人调用myWriter.Write(someIntValue);
,int重载将优先于模板化方法.
相反,我的编译器(Visual C++ 11.0 RC)总是选择模板方法.例如,以下代码段将打印Wrote any
到控制台:
struct ComplexWriterImpl : public ComplexWriter {
virtual void Write(int value) { std::cout << "Wrote an int"; } …
Run Code Online (Sandbox Code Playgroud) 我正在尝试将URL编码的帖子发送到用PHP实现的REST API.POST数据包含两个用户提供的字符串:
WebRequest request = HttpWebRequest.Create(new Uri(serverUri, "rest"));
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
request.Headers.Add("Content-Transfer-Encoding", "binary");
// Form the url-encoded credentials we'll use to log in
StringBuilder builder = new StringBuilder();
builder.Append("user=");
builder.Append(user);
builder.Append("&password=");
builder.Append(password);
byte[] credentials = Encoding.UTF8.GetBytes(builder.ToString());
// Write the url-encoded post data into the request stream.
request.ContentLength = credentials.Length;
using (Stream requestStream = request.GetRequestStream()) {
requestStream.Write(credentials, 0, credentials.Length);
}
Run Code Online (Sandbox Code Playgroud)
这会向包含user=myusername&password=mypassword
UTF-8 的服务器发送HTTP请求作为其POST数据.
如何逃避用户提供的字符串?例如,如果我有一个名为的用户big&mean
,那么如何对&符号进行转义,以免它弄乱请求行?
我正在尝试在WPF DataGrid中显示一系列行,其中每行包含一个布尔数组(其数量对于所有行都相同,它不是锯齿状的2D数组),我想将其显示为单独的列,例如.
Name | Day 1 | Day 2 | Day 3 | Day 4 | Day 5 | Day 6 |
-----------------------------------------------------------------
Bring out Trash | X | | X | | | X |
Pay Bills | | | | | X | |
Commit Suicide | | | | | | X |
Run Code Online (Sandbox Code Playgroud)
目前,我正在将此类用于我的DataGrid行:
private class GridRow {
public string Name { get; set; }
public char Day1 { get; set; }
public char Day2 { get; …
Run Code Online (Sandbox Code Playgroud) 在C#中,如果使用Type.GetFields()
表示派生类的类型,它将返回a)派生类中所有显式声明的字段,b)派生类中自动属性的所有支持字段和c)基础中所有显式声明的字段类.
为什么缺少基类中自动属性的d)支持字段?
例:
public class Base {
public int Foo { get; set; }
}
public class Derived : Base {
public int Bar { get; set; }
}
class Program {
static void Main(string[] args) {
FieldInfo[] fieldInfos = typeof(Derived).GetFields(
BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Instance | BindingFlags.FlattenHierarchy
);
foreach(FieldInfo fieldInfo in fieldInfos) {
Console.WriteLine(fieldInfo.Name);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这将只显示Bar的支持字段,而不是Foo.
我正在编写一个确定.NET枚举中最高值的方法,因此我可以为每个枚举值创建一个BitArray:
pressedKeys = new BitArray(highestValueInEnum<Keys>());
Run Code Online (Sandbox Code Playgroud)
我需要两个不同的枚举,所以我把它变成了一个通用的方法:
/// <summary>Returns the highest value encountered in an enumeration</summary>
/// <typeparam name="EnumType">
/// Enumeration of which the highest value will be returned
/// </typeparam>
/// <returns>The highest value in the enumeration</returns>
private static int highestValueInEnum<EnumType>() {
int[] values = (int[])Enum.GetValues(typeof(EnumType));
int highestValue = values[0];
for(int index = 0; index < values.Length; ++index) {
if(values[index] > highestValue) {
highestValue = values[index];
}
}
return highestValue;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我将Enum.GetValues()的返回值转换为int [],而不是EnumType [].这是因为我以后不能将EnumType(这是一个泛型类型参数)转换为int.
代码有效.但它有效吗?我是否可以始终将Enum.GetValues()的返回值转换为int []?
我想知道在对象中装入一个值类型是否是一种特殊情况,或者在删除对它的任何引用后,由.NET构造的"框"是否变为垃圾(GC必须收集).
例如,StringBuilder.AppendFormat()具有以下重载:
StringBuilder.AppendFormat(string format, object arg0);
StringBuilder.AppendFormat(string format, object arg0, object arg1);
StringBuilder.AppendFormat(string format, object arg0, object arg1, object arg2);
StringBuilder.AppendFormat(string format, params object[] args);
Run Code Online (Sandbox Code Playgroud)
对于具有3个或更少参数的调用具有这些额外的重载可能表明装箱确实是一种特殊情况(或者从性能观点来看,它是值得的,以避免阵列构造).
从理论上讲,使用普通的旧引用计数,可能带有可重用框的池将是一个有效的实现,因为不能从一个框到另一个框的引用,只能从.NET对象到框.
我正在运行安装了Visual Studio 11 Beta的Windows 8 Consumer Preview.
当我创建一个新的WinRT/Metro应用,编译并运行该应用空白的应用程序认证工具包,它已经失败,因为调用的GetModuleFileNameW
,GetModuleHandleW
,LoadLibraryExW
,LoadLibraryW
和lstrlenA
.
我在整个源代码树中搜索了这些调用,但找不到它们.这使我相信它们可以在模板项目导入的库中找到.
我找不到任何声明,这是否是Visual Studio Beta,App Certification Kit的问题,或者我是否必须自己采取行动.任何人都可以开导我吗?
visual-studio windows-8 windows-runtime app-certification-kit wack
假设我有一个C++迭代器,它不仅遍历数据结构,而且在解除引用时也对元素应用转换.
作为一个真实的例子,这里有一个迭代器遍历位图中的像素,将位图特定的像素格式转换为方便的结构:
class ConstPixelIterator {
public: struct Pixel {
float Red;
float Green;
float Blue;
float Alpha;
};
public: ConstPixelIterator(const Bitmap &bitmap);
// ...standard iterator functionality...
public: Pixel operator *() {
// Read from memory and convert pixel format-specific bytes into Pixel structure
}
};
Run Code Online (Sandbox Code Playgroud)
现在,如果我想实现一个非const迭代器(即让用户修改像素),那么最好的方法是什么?
我考虑过的一些想法:
我可以在Pixel
结构中放置访问器方法而不是普通字段,并为其所有者提供电话回家的参考.然而,这意味着如果用户改变了R,G,B和A,我会将像素转换为位图的像素格式4次并写入存储器4次.
我可以从迭代器返回一个Pixel引用,并为它提供一个Update()
在像素被更改时需要调用的方法.这将是非直观的并且冒着用户忘记打电话的风险Update
.
我总是可以返回Pixel
by值并提供一个特殊的赋值运算符.是否打破标准迭代器模式 - 在没有解除引用的情况下分配给迭代器应该移动迭代器,而不是更新它指向的元素
我正在尝试为WinRT编译Boost 1.49.0.我已经了解了一个方法:GetSystemInfo(),它在boost :: thread :: hardware_concurrency()中用于获取系统上的逻辑处理器数量.
我还没有在WinRT中找到任何替代品.
我可以使用另一种方法吗?
XAML允许我将属性附加到不是从DependencyObject派生的类型.例如,我可以在Window上为CommandBindings命名:
<Window.CommandBindings>
<CommandBinding x:Name="Refresh" Command="NavigationCommands.Refresh" />
<CommandBinding x:Name="Print" Command="ApplicationCommands.Print" />
</Window.CommandBindings>
Run Code Online (Sandbox Code Playgroud)
我在MSDN(附加属性概述)中发现了这种可能性,它指出" 如果你的类严格定义附加属性以便在其他类型上使用,那么该类不必从DependencyObject派生.但你需要派生自DependencyObject如果你遵循整个WPF模型,你的附加属性也是一个依赖属性. " - 但我不知道如何在代码中获取这些附加属性.
鉴于上面插入的XAML代码<Window />
,如何x:Name
从每个代码中检索属性的值CommandBinding
?