比赛训练笔记 - WebForm

ASPX 标签

<% C#代码 %>

可以在网页渲染时执行代码。

<% for(int i=0; i<5; i+=1) { %> 
   <% Response.Write("<br>" + i) %> 
<% } %>

<%= C#代码 %>

等同于调用Response.Write(...)

public string GetDate() {
    return DateTime.Now.ToString("yyyy-MM-dd");
}
Today is <%= GetDate() %>

比赛训练笔记 - WinForm

DataGridView

使用错误容器时的巨坑

使用 List 作为 DataSource。点击单元格时,就算没有单元格点击事件,也会在外层(父窗体 ShowDialog 子窗体的位置)报 IndexOutOfRange 下标越界异常。
解决方法:只要是用于 DGV 显示的列表,一律用BindingList

BindingList

ResetBinding()(对于整个列表)或ResetItem(i)(对于特定元素)来手动触发“列表已改变”事件。
RaiseListChangedEvents属性控制 BindingList 是否会发出“列表已改变”的事件。
注意:这个属性不仅控制添加和删除元素时是否会自动触发事件,同时也控制ResetBinding() / ResetItem(i)这类手动触发事件的方法是否会触发事件。

添加向列表大量元素时的标准流程:

list.RaiseListChangedEvents = false;

list.Clear();
foreach(var item in source)
{
    list.Add(item);
}

// 一定要先启用事件,然后再手动触发事件。
list.RaiseListChangedEvents = true;
list.ResetBindings();

比赛训练笔记 - Android

屏幕旋转

检测屏幕方向:

int orientation = getResources().getConfiguration().orientation;
boolean landscape = (orientation == Configuration.ORIENTATION_LANDSCAPE);

强制Activity横屏

AndroidManifest里给Activity标签添加属性:

android:screenOrientation="landscape"

切换时自动重建

创建layout时在Qualifier列表中添加Orientation属性。调用R.layout.xxx时会自动根据屏幕方向选择对应的layout。

【C#】volatile 和内存屏障

原文:https://learn.microsoft.com/en-us/archive/msdn-magazine/2012/december/csharp-the-csharp-memory-model-in-theory-and-practice

半内存屏障

例如有这样的程序,Init()Print()在不同的线程上执行。

int data = 0;
bool inited = false; // 指示data字段是否已经设置的标志

void Init(){
    data = 42;
    inited = true; // 设置标志,指示data字段已经设置好了
}
void Print(){
    // 如果有inited的标志,打印data字段的值
    // 否则打印 Not initialized!
    if(inited){
        Console.WriteLine(data);
    }else{
        Console.WriteLine("Not initialized!");
    }
}

【JS / TS】函数 this 丢失问题

今天在写一个显示当前时间的网页,用了一个回调,来每秒更新时间。
但是实际运行时,时间并没有动态更新。

原因

仔细查了一下,原来是 Javascript 函数的 this 是在调用函数时确定的。

foo.call(this,args...);

观察一下函数的call函数的签名,可以发现第一个参数传入了 this 的值,函数运行时的 this 就是调用时传入的 this。
而回调函数被执行时,this已经不是我们原来预想的this了,所以变量没有被更改。

解决

那么如果要用回调函数,使用原来的this,该怎么办呢?
函数里提供了bind函数,可以用来内定函数调用时this的值和参数。

foo.bind(this,args...);

而在bind时写的参数,在执行时就会被插入到参数列表的最前面,可以用来内定前几个参数的值。
调用了bind之后,返回的是一个新的函数,它的this和前几个参数已经被内定死了。
之后函数被调用时无论传入的this是什么,实际执行时的this始终都是bind时内定好的this