我正在编写一个原型TCP连接,我在整理要发送的数据时遇到了一些麻烦.
目前,我只发送字符串,但将来我们希望能够发送任何对象.
目前代码非常简单,因为我认为所有内容都可以转换为字节数组:
void SendData(object headerObject, object bodyObject)
{
byte[] header = (byte[])headerObject; //strings at runtime,
byte[] body = (byte[])bodyObject; //invalid cast exception
// Unable to cast object of type 'System.String' to type 'System.Byte[]'.
...
}
Run Code Online (Sandbox Code Playgroud)
这当然很容易用a来解决
if( state.headerObject is System.String ){...}
Run Code Online (Sandbox Code Playgroud)
问题是,如果我这样做,我需要检查在运行时无法转换为byte []的每种类型的对象.
由于我不知道在运行时无法将每个对象强制转换为byte [],因此这不是一个选项.
如何将任何对象转换为C#.NET 4.0中的字节数组?
我使用XmlSerializer在一行代码上得到一个BindingFailure:
XmlSerializer s = new XmlSerializer(typeof(CustomXMLSerializeObject));
Run Code Online (Sandbox Code Playgroud)
具有显示名称CustomXMLSerializeObject.XmlSerializers'的程序集无法加载到ID为1的AppDomain的"LoadFrom"绑定上下文中.失败的原因是:System.IO.FileNotFoundException:无法加载文件或程序集XMLSerializeObject.XmlSerializers,Version = 1.4.0.0,Culture = neutral,PublicKeyToken = null'或其依赖项之一.该系统找不到指定的文件.
错误很长,继续解释预绑定状态信息以及它试图找到文件的位置.
我试图去序列化的自定义对象相对简单 - 只是一堆私有整数和具有公共访问器的字符串.我有一个私有变量,它是另一个自定义的可序列化类,但它只有私有字符串,其中包含公共访问器.
尴尬的部分?这只在我反序列化时发生.当我序列化对象时,那行代码运行正常.它工作正常,对象被反序列化并完美填充.不要注意任何性能损失或加载时间过长.
这个警告究竟是什么(不是错误或异常,之后程序运行良好)?为什么会这样?如何在不简单禁用警告的情况下阻止它?
我想有一个std :: map(int .NET 4.0).我们当然知道地图是一棵树,需要一个运算符<该字符串没有为我们定义.
错误24错误C2676:二进制'<':'const std :: string'未定义此运算符或转换为预定义运算符可接受的类型c:\ program files\microsoft visual studio 10.0\vc\include\xfunctional 125 1 FXCMMarketDataServer
所以我把我的google-foo工作并找到了这个解决方案:
struct StringComparerForMap
{
public:
bool operator()(const std::string x, const std::string y)
{
// Add compare logic here
}
};
...
std::map<std::string, CustomObject, StringComparerForMap> myMap;
Run Code Online (Sandbox Code Playgroud)
这种方法运行良好一段时间,现在我遇到了一个我认为是由此导致的错误.在STL框架的某个深处,它似乎忽略了上面的定义,默认为operator <.
在VS2010 .NET 4.0中有没有办法使用字符串作为地图的关键?
我知道我可以接受该字符串并编写一个函数将其哈希到一个int,但那里的乐趣在哪里?
编辑
我将尽力为大卫解释这一点.当映射使用比较器结构时,它在发布时崩溃并在调试中失败调试断言.失败的断言在xtree第1746行.
表达式:无效的运算符<
|中止| |重试| |忽略|
这就是让我相信尽管给地图一个比较器,它仍然向某些路径默认为运算符<进行比较.我的代码中导致这一点的行是:
CustomObject o = stringObjectMap[key];
Run Code Online (Sandbox Code Playgroud) 我几乎可以肯定这将是一个非常简单的答案,但我似乎无法在任何地方找到它.我们都知道当你将鼠标悬停在某些东西(如字符串)上时会弹出一个小摘要(如果已启用).对于一个字符串,它说:
class System.String
将文本表示为一系列Unicode字符.
当我鼠标的一个我的类,它只是说:
classNamespace.Widget
我已经尝试了我发现的两个明显的例子:
/// <summary>
/// This summary does not work, I know it's for html documenting tools but thought it was worth a shot.
/// </summary>
Run Code Online (Sandbox Code Playgroud)
和:
// Summary:
// This is what is in some of the base libraries, and does not work as well.
Run Code Online (Sandbox Code Playgroud)
那么,如何在鼠标悬停弹出窗口中添加摘要?
我正在创建一个自定义泛型类:
class Widget< T1, T2>
{
...
public bool Bar( T1 type1 )
{
...
}
public bool Bar( T2 type2 )
{
...
}
...
}
Run Code Online (Sandbox Code Playgroud)
当然,以下行会产生一个模糊的调用编译错误:
Widget<int, int> Foo = new Widget<int, int>();
...
Foo.Bar(5);
...
Run Code Online (Sandbox Code Playgroud)
有没有办法解决?是否有一个条款,我可以把它放在"where:TypeOf(T1)!= TypeOf(T2)",或任何方式使这种歧义?最好是int,int可用,但它不是manditory.
更新:
对于那些感兴趣的人,我实际上自己为这个问题找到了一个可接受的解决方案(对我来说)
class Widget< T1, T2>
{
...
public bool Bar( object o )
{
if( o.GetType() == typeof(T1) )
{
...
}
if( o.GetType() == typeof(T2) )
{
...
}
}
...
}
Run Code Online (Sandbox Code Playgroud) 我收到一个整数,表示小数面额的美元金额.我想要一种算法,可以添加这些数字而无需解析并将它们转换为双精度或小数.
例如,我收到整数50155,这意味着50和15.5/32美元.然后我收到10210,即10和21/32美元.所以50 15.5/32 + 10 21/32 = 61 4.5/32,因此:
50155 + 10210 = 61045
我想再次避免这种情况:
int a = 50155;
int b = a / 1000;
float c = a % 1000;
float d = b;
d += c / 320f;
// d = 50.484375
Run Code Online (Sandbox Code Playgroud)
我更喜欢这个:
int a = 50155;
int b = 10210;
int c = MyClass.Add(a.b); // c = 61045
...
public int Add(int a, int b)
{
// ?????
}
Run Code Online (Sandbox Code Playgroud)
在此先感谢您的帮助!
我正在编写一个非常简单的RSS阅读器 - 它需要做的就是获取xml文档,并在控制台上打印每个项目的标题和发布日期.我开始使用这两个问题:
我正在试图弄清楚如何订阅,并且据我所知,你可以通过两种方式做到这一点.向源站点发送HTTP请求,以便在它们到来时推送更新,或者每隔X秒轮询站点并简单地打印新站点.
由于数百万的RSS阅读器在任何特定时刻都在运行,我觉得很难相信无法订阅,因为所有这些,流行的RSS网站如facebook,twitter或myspace每秒都会被击中数亿次. RSS阅读器"订阅"它,看起来像DOS攻击.
那么订阅RSS源的"标准"方式是什么?如果这样的标准真的存在的话?
我正在创建一个通用类来保存小部件,我在实现contains方法时遇到问题:
public class WidgetBox<A,B,C>
{
public bool ContainsB(B b)
{
// Iterating thru a collection of B's
if( b == iteratorB ) // Compiler error.
...
}
}
Run Code Online (Sandbox Code Playgroud)
错误:运算符'=='无法应用于'V'和'V'类型的操作数
如果我无法比较类型,我如何实现包含?字典,列表和所有其他通用容器如何做到这一点?
我有一个小部件类:
public class Widget
{
...
public string UniqueID = "856D9PWW";
public int Price = 325;
public byte[] Data;
...
}
Run Code Online (Sandbox Code Playgroud)
我想要一个数据结构来存储我的小部件.这里有捕获 - 有时我需要根据它们的价格找到一组小部件,有时我需要根据它的ID找到一个特定的小部件.
我不想使用两个数据结构并在必要时使用它们,并且当我从第一个数据结构中删除它时将其从另一个数据结构中删除(这包括创建我自己的数据结构,在"封面"下执行此操作).我想数据结构,允许我使用多个键,只需要使用其中一个键从中删除一个项目,并具有在其中一个键下存储多个项目的功能.
我想更改我的二进制文件对我的应用程序的图标.与我合作的人并不精通技术,并且确实将AppName.exe更改为CLICK ME.exe,因为他们不知道要点击哪个图标...
无论如何,我认为一个简单的解决方案是让我的所有应用程序都具有相同的,明亮的图标,这样他们就不会再那么困惑了.我不知道如何做到这一点,并没有在谷歌上找到太多帮助.
我希望我不会对我的代表太过刻薄,因为我甚至不确定这是一个编程问题!
由于表单/对话框底部的"确定"和"取消"按钮的优先级,我很奇怪我似乎无法找到一种"标准"方式来保存控件状态.
例如,我有一个检查列表框的过滤器.当用户单击"确定"按钮时,它会将过滤器应用于数据集并关闭表单.如果用户单击取消按钮,则表单将撤消所有选中项目更改并关闭表单.
在完美的世界中,当用户点击"确定"按钮时,用当前控制状态覆盖保存的控制状态,并设置新状态标志.当表单关闭时,如果设置了新状态标志,则表单将重置该标志,如果未设置,则表单将使用保存的控件状态替换显示的控件.这样,如果点击取消按钮,则重置用户所做的所有检查更改.
处理取消按钮的最佳实践方法是什么?撤消对控件甚至整个表单的更改?有最佳实践解决方案吗?我可以看到这对于文本框,径向按钮,复选框以及几乎所有控件都是必需的,因此请尝试保持它的通用性,而不是特定于选中的列表框.