小编hai*_*yyu的帖子

自定义EventHandler与EventHandler <EventArgs>

最近我一直想知道这段代码之间是否有任何显着差异:

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# events handlers

63
推荐指数
1
解决办法
2万
查看次数

包括.cpp文件?

可能重复:
为什么模板只能在头文件中实现?

我最近一直在尝试使用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)

但是,这并没有改变任何事情.错误消息保持不变.我一直试图在互联网上找到一些信息,然而,它并没有真正解决.

c++ linker templates

14
推荐指数
1
解决办法
6665
查看次数

BitArray以错误的方式返回位?

这段代码:

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)

我知道有一点点大端,虽然这些术语只涉及字节的位置.据我所知,它们不会影响比特.

c# enumeration bitarray

13
推荐指数
1
解决办法
5753
查看次数

解决问题"无法访问被处置对象".例外

在我当前的项目中有一个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)

c# dispose exception winforms

13
推荐指数
3
解决办法
2万
查看次数

比较参考?

使用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)

c# reference list equals

10
推荐指数
1
解决办法
4130
查看次数

ReceiveAsync与BeginReceive的性能

我正在编写客户端应用程序,我想知道是否应该使用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吗?

c# sockets performance asynchronous tcp

7
推荐指数
2
解决办法
1万
查看次数

EventHandlers和Covariance

我一直在尝试创建一个通用事件.基本上它应该是这样的:

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."

我想知道为什么这不起作用.如果是这样会导致什么问题?或者我错过了一些工作的东西?

提前致谢!

c# events delegates variance

6
推荐指数
1
解决办法
661
查看次数

测量包裹的字符串

我正在尝试创建一个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循环来测量每个角色的宽度等等.有没有更简单的方法呢?

c# gdi+ word-wrap winforms

5
推荐指数
1
解决办法
5586
查看次数

关于将EndPoint传递给Socket.ReceiveFrom()的不确定性

如果我做这样的事情:

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"传递?

c# sockets udp reference endpoint

5
推荐指数
1
解决办法
1896
查看次数

无法使用BinaryWriter写入MemoryStream

我试过这段代码:

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行中显示的初始化的最后一个参数显然是正确的,所以我应该能够写入流.如果我没有指定起始索引和计数,它可以工作.

为什么会这样?

c# stream

3
推荐指数
1
解决办法
9995
查看次数