在 VS 上玩过这段代码:
int a;
int b = !!!!!!!!!!!!!!!!!!!!!!!!!!a;
int c = ++++++++++++++++++++++++++a;
int d = --------------------------a;
这就是发生的事情——如果你编译为 C——那么它会写出 for++并且--需要一个左边的值。但是如果你编译为 C++,它编译没有错误。
我不明白其中的区别,请帮助我。
在 VS 上玩过这段代码:
int a;
int b = !!!!!!!!!!!!!!!!!!!!!!!!!!a;
int c = ++++++++++++++++++++++++++a;
int d = --------------------------a;
这就是发生的事情——如果你编译为 C——那么它会写出 for++并且--需要一个左边的值。但是如果你编译为 C++,它编译没有错误。
我不明白其中的区别,请帮助我。
假设有一个字节数组
byte[] bytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
像这样
[StructLayout(LayoutKind.Explicit)]
struct ByteToUlongConverter
{
[FieldOffset(0)]
public byte[] bytes;
[FieldOffset(0)]
public ulong[] ulongs;
public ByteToUlongConverter(byte[] bytes)
{
this.ulongs = null;
this.bytes = bytes;
}
}
结构体。
接下来,有了这个结构,我做
ByteToUlongConverter conv = new ByteToUlongConverter(bytes);
foreach (ulong ul in conv.ulongs)
Console.WriteLine($"{ul:X16}");
这输出类似
0807060504030201
793C086C00000000
0000000000000000
0000000000000000
0000000000000000
0000000004710B40
00000001793BFDD8
793BED0C00000000
那些。我分配了8个字节,读了64个(你甚至不仅可以读,还可以写东西)。
这些额外的字节是谁的?这是什么记忆?那些。据我所知,我的阵列位于堆中的某个地方,而这是附近的东西。.Net 中的堆是如何组织的,所有进程都一样还是每个进程都有自己的堆?那些。另一个没有特权的进程可以尝试以这种方式读取我进程中的某些内容吗?
为什么禁止从值类型继承,比如struct?什么struct sealed是明确的 :) 但他们为什么要这样做sealed?
如何在不让元素从其原始位置移动超过给定数量 (N) 的情况下对数组进行洗牌?假设 N=1:[1, 2, 3, 4, 5]可以混入[1, 3, 2, 4, 5]or [2, 1, 3, 5, 4],但不能混入[5, 2, 1, 3, 4].
有没有任何算法?唉,我什么都google不了,我的实现也不是很统一。
但是,以防万一:
/// <summary>
/// Возвращает перемешанный заданным образом массив размером size с элементами от 0
/// до size−1. В дальнейшем этот массив будет использован как список новых позиций.
/// </summary>
/// <param name="size">Число элементов</param>
/// <param name="limit">Максимальное смещение</param>
/// <returns>Перемешанный список индексов</returns>
private int[] Shuffle(int size, int limit) {
var buffer = new int[size];
for (var i = 0; i < buffer.Length; i++) {
buffer[i] = i;
}
for (var i = buffer.Length - 1; i >= 0; i--) {
// Узнаём оригинальную позицию элемента
var t = buffer[i];
// Границы для поиска относительно оригинальной позиции
var a = Math.Max(t - limit, 0);
var b = Math.Min(t + limit, buffer.Length - 1);
// Выбираем кандидата на обмен
var n = _randomInstance.Next(a, b + 1);
// Самого на себя не меняем
if (n != i) {
// Возможные границы обмена для найденного элемента
var ai = Math.Max(i - limit, 0);
var bi = Math.Min(i + limit, buffer.Length - 1);
// Узнаём оригинальную позицию элемента
var v = buffer[n];
// Если оригинальная позиция найденного вписывается в границы
// вокруг i, можно заменить
if (v >= ai && v <= bi) {
buffer[i] = buffer[n];
buffer[n] = t;
}
}
}
return buffer;
}
有一个(模块化的)游戏应用程序——竞技场,它为玩家实现了一个抽象类(或接口)。Players(游戏AI)继承自指定的类,由第三方开发者开发,以编译后的dll形式提供。是否有可能完全限制此第三方 dll 的功能?好吧,例如,为了防止“FORMAT C:”或通过网络发送数据,从磁盘读取等。即使在这种情况下属于此类,玩家也只会算作技术失败。
我在战斗,但为了我的生活,我不知道如何让它发挥作用。如何让所有第三方玩家都在沙盒中工作?现在有这样的代码:
static class PlayersHost
{
static public List<IPlayer> Players;
static public void LoadPlayers()
{
Players = new List<IPlayer>();
var files = Directory.EnumerateFiles(Path.Combine(Environment.CurrentDirectory, "Players"), "*.dll");
foreach (var file in files)
{
try
{
var asm = Assembly.LoadFrom(file);
var types = asm.GetTypes();
foreach (var type in types)
{
try
{
IPlayer player = (IPlayer)Activator.CreateInstance(type);
players.Add(player);
}
catch { }
}
}
catch { }
}
}
}
然后我在应用程序启动时加载所有播放器:
PlayersHost.LoadPlayers();
并使用生成的集合,例如:
var player = PlayersHost.Players[0];
try { player.PrepareToPlay(); } catch { }
需要一个解决方案使用AppDomain