最近我一直想知道这段代码之间是否有任何显着差异:
public event EventHandler<MyEventArgs> SomeEvent;
Run Code Online (Sandbox Code Playgroud)
还有这个:
public delegate void MyEventHandler(object sender, MyEventArgs e);
public event MyEventHandler SomeEvent;
Run Code Online (Sandbox Code Playgroud)
他们都做同样的事情,我无法分辨出任何差异.虽然我注意到.NET Framework的大多数类都为其事件使用自定义事件处理程序委托.这有什么特别的原因吗?
可能重复:
为什么模板只能在头文件中实现?
我最近一直在尝试使用C++.目前我正在尝试编写一些我确定至少已经完成过一次的东西:一个简单的LinkedList类.代码完成了,但我不知道怎么编译它.我一直在谷歌搜索,似乎我正在链接目标文件错误.这就是我的代码基本上是这样的:
TEST.CPP
#include "linkedlist.h"
int main()
{
LinkedList<int> list;
// do something
}
Run Code Online (Sandbox Code Playgroud)
linkedlist.h
template <typename T>
class LinkedList
{
// a lot of function and variable definitions
}
Run Code Online (Sandbox Code Playgroud)
然后是一个名为linkedlist.cpp的.cpp文件,其中包含LinkerList类的所有实际代码.尝试使用以下命令编译test.cpp时:
g++ ..\src\test.cpp
Run Code Online (Sandbox Code Playgroud)
我被告知有一个未定义的引用'LinkedList :: LinkedList()'.所以我一直认为它被链接错误,因为有多个.cpp文件,所以我尝试了这样:
g++ -c -Wall -O2 ..\src\test.cpp
g++ -c -Wall -O2 ..\src\linkedlist.cpp
g++ -s test.o linkedlist.o
Run Code Online (Sandbox Code Playgroud)
但是,这并没有改变任何事情.错误消息保持不变.我一直试图在互联网上找到一些信息,然而,它并没有真正解决.
这段代码:
BitArray bits = new BitArray(new byte[] { 7 });
foreach (bool bit in bits)
{
Console.WriteLine(bit ? 1 : 0);
}
Run Code Online (Sandbox Code Playgroud)
给我以下输出:
11100000
Run Code Online (Sandbox Code Playgroud)
不应该是相反的方式吗?像这样:
00000111
Run Code Online (Sandbox Code Playgroud)
我知道有一点点大端,虽然这些术语只涉及字节的位置.据我所知,它们不会影响比特.
在我当前的项目中有一个Form类,如下所示:
public partial class FormMain : Form
{
System.Timers.Timer timer;
Point previousLocation;
double distance;
public FormMain()
{
InitializeComponent();
distance = 0;
timer = new System.Timers.Timer(50);
timer.AutoReset = true;
timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
timer.Start();
}
private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if (previousLocation != null)
{
// some code
UpdateDistanceLabel(distance);
UpdateSpeedLabel(v);
}
previousLocation = Cursor.Position;
}
private void UpdateDistanceLabel(double newDistance)
{
if (!lblDistance.IsDisposed && !IsDisposed)
{
Invoke(new Action(() => lblDistance.Text = String.Format("Distance: {0} pixels", newDistance)));
}
}
private void UpdateSpeedLabel(double …
Run Code Online (Sandbox Code Playgroud) 使用System.Collections.Generic中的List类时,Contains或IndexOf等方法将使用IEquatable实现的Equals方法或Object类提供的重写Equals方法来比较传递的引用对象.如果未覆盖Object.Equals,它将检查传递的引用是否指向与其自身相同的对象.
我的问题是:如果等于被覆盖,是否有一种方法可以通过引用进行List比较?下面的代码将从列表中删除该项:
class Program
{
static void Main(string[] args)
{
var s1 = new SomeClass() { A = 5 };
var s2 = new SomeClass() { A = 5 };
var list = new List<SomeClass>();
list.Add(s1);
list.Remove(s2); // s1 will get removed, even though s2 has been
// passed, because s1's Equals method will return true.
}
}
class SomeClass
{
public int A { get; set; }
public override bool Equals(object obj)
{
SomeClass s = obj as SomeClass; …
Run Code Online (Sandbox Code Playgroud) 我正在编写客户端应用程序,我想知道是否应该使用Socket类的ReceiveAsync或BeginReceive方法.到目前为止,我一直在使用后者,但是,我发现它似乎对CPU有很大的压力.这是我的接收循环基本上看起来像:
private void socket_ReceiveCallback(IAsyncResult result_)
{
// does nothing else at the moment
socket.EndReceive(result_);
byte[] buffer = (byte[])result_.AsyncState;
// receive new packet
byte[] newBuffer = new byte[1024];
socket.BeginReceive(newBuffer, 0, newBuffer.Length, SocketFlags.None,
socket_ReceiveFallback, newBuffer);
}
Run Code Online (Sandbox Code Playgroud)
现在我一直想知道我在这里做错了什么,因为其他通信应用程序根本不会给CPU带来压力.而且我想知道我是否会更好地使用SocketAsyncEventArgs和ReceiveAsync.
所以这是我的问题:
为什么我的循环如此强调CPU?我应该使用SocketAsyncEventArgs和ReceiveAsync而不是BeginReceive吗?
我一直在尝试创建一个通用事件.基本上它应该是这样的:
namespace DelegateTest
{
class Program
{
static void Main(string[] args)
{
var lol = new SomeClass();
lol.SomeEvent += handler;
}
static void handler(object sender, SomeDerivedClass e)
{
}
}
class SomeClass
{
public delegate void SomeEventDelegate<in T>(object sender, T data);
public event SomeEventDelegate<ISomeInterface> SomeEvent;
}
interface ISomeInterface
{
}
class SomeDerivedClass : ISomeInterface
{
}
}
Run Code Online (Sandbox Code Playgroud)
我想允许用户传递任何委托,其中第二个参数派生自"ISomeInterface".
"in"指定反差,对吗?这意味着如果API期望更通用的东西,你可以传递更具体的东西(在我的基础"ISomeInterface"将是通用的,而我的"SomeDerivedClass"将是特定的.)但是,我被告知我的编译器"方法处理程序没有重载匹配DelegateTest.SomeClass.SomeEventDelegate."
我想知道为什么这不起作用.如果是这样会导致什么问题?或者我错过了一些工作的东西?
提前致谢!
我正在尝试创建一个Control,它基本上允许我在彼此之下绘制不同的字符串.但是,字符串的宽度可能不会大于控件的宽度.为了解决这个问题,我想将RectangleF对象传递给Graphics.DrawString方法.这将包裹比传递的矩形宽度更宽的字符串.虽然这确实解决了如果它太大而无法看到整个字符串的问题,但还有另一个问题.如果我尝试这样的事情
Graphics g = e.Graphics; // Paint event
g.DrawString(someText, someFont, someBrush, new PointF(0, 0), someRectangleF);
g.DrawString(someMoreText, someFont, someBrush, new PointF(0, 12), someRectangleF);
Run Code Online (Sandbox Code Playgroud)
问题是如果someText被包装,第三行将在第一个文本上绘制文本,从而使得很难/不可能被阅读.
我正在寻找这个问题的解决方案,我发现了一些有趣的链接,但是包括使用for循环来测量每个角色的宽度等等.有没有更简单的方法呢?
如果我做这样的事情:
byte[] buffer = new byte[1024];
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint remote = new IPEndPoint(IPAddress.Parse("12.34.56.78"), 1337);
sock.ReceiveFrom(buffer, ref remote);
Run Code Online (Sandbox Code Playgroud)
ReceiveFrom方法是否只接收来自正在传递的端点的数据包?文档说明如下:
使用无连接协议,ReceiveFrom将读取接收到本地网络缓冲区的第一个入队数据报.
这是否意味着传递的EndPoint仅用于存储数据包来自的主机的EndPoint,并且根本不影响ReceiveFrom方法的行为?如果是这样,为什么需要将其作为"ref"而不是"out"传递?
我试过这段代码:
byte[] someData = new byte[] { 1, 2, 3, 4 };
MemoryStream stream = new MemoryStream(someData, 1, someData.Length - 1, true);
using (BinaryWriter writer = new BinaryWriter(stream))
{
writer.Write(1);
}
stream.Dispose();
Run Code Online (Sandbox Code Playgroud)
每次运行时,都会抛出NotSupportedException,告诉我无法写入流.为什么会这样?第2行中显示的初始化的最后一个参数显然是正确的,所以我应该能够写入流.如果我没有指定起始索引和计数,它可以工作.
为什么会这样?