[英]C# is not working in release build
試圖在C#應用程序上調試問題,我偶然發現了這個問題,這是導致應用程序出現故障的原因。
基本上我有這個代碼:
double scale = 1;
double startScale = 1;
...
scale = (e.Scale - 1) * startScale;
if(scale <= 1)
scale = 1;
...
會發生的是,即使scale
大於1,如果scale
最終為1,則執行進入內部。
這僅在發布版本中發生。
有沒有人知道發生了什么?
編輯
這幾乎(只缺少什么都沒做的ctor,Xamarin Forms的自定義控件,取自他們的例子來實現捏手勢( 這里 ))。
public class PinchView : ContentView
{
private double StartScale = 1;
private double CurrentScale = 1;
private double XOffset = 0;
private double YOffset = 0;
...
private void PinchGesture_PinchUpdated(object sender, PinchGestureUpdatedEventArgs e)
{
if (e.Status == GestureStatus.Started)
{
// Store the current scale factor applied to the wrapped user interface element,
// and zero the components for the center point of the translate transform.
StartScale = Content.Scale;
Content.AnchorX = 0;
Content.AnchorY = 0;
}
if (e.Status == GestureStatus.Running)
{
// Calculate the scale factor to be applied.
CurrentScale += (e.Scale - 1) * StartScale;
if(CurrentScale <= 1)
{
CurrentScale = 1;
}
// The ScaleOrigin is in relative coordinates to the wrapped user interface element,
// so get the X pixel coordinate.
double renderedX = Content.X + XOffset;
double deltaX = renderedX / Width;
double deltaWidth = Width / (Content.Width * StartScale);
double originX = (e.ScaleOrigin.X - deltaX) * deltaWidth;
// The ScaleOrigin is in relative coordinates to the wrapped user interface element,
// so get the Y pixel coordinate.
double renderedY = Content.Y + YOffset;
double deltaY = renderedY / Height;
double deltaHeight = Height / (Content.Height * StartScale);
double originY = (e.ScaleOrigin.Y - deltaY) * deltaHeight;
// Calculate the transformed element pixel coordinates.
double targetX = XOffset - (originX * Content.Width) * (CurrentScale - StartScale);
double targetY = YOffset - (originY * Content.Height) * (CurrentScale - StartScale);
// Apply translation based on the change in origin.
Content.TranslationX = targetX.Clamp(-Content.Width * (CurrentScale - 1), 0);
Content.TranslationY = targetY.Clamp(-Content.Height * (CurrentScale - 1), 0);
// Apply scale factor.
Content.Scale = CurrentScale;
}
if (e.Status == GestureStatus.Completed)
{
// Store the translation delta's of the wrapped user interface element.
XOffset = Content.TranslationX;
YOffset = Content.TranslationY;
}
}
}
這些是我的調試會話的步驟( e.Scale
已經過優化且不可見,但您可以看到CurrentScale
的值發生變化):
CurrentScale
和StartScale
是實例字段而不是方法字段,因此它們可能受另一個線程的影響。 要檢測任何競爭條件,您是否可以鎖定此塊並再次調試:
lock (StartScale) {
// Calculate the scale factor to be applied.
CurrentScale += (e.Scale - 1) * StartScale;
if(CurrentScale <= 1)
{
CurrentScale = 1;
}
}
如果這樣做,您應該使用局部變量獲得更好的結果,以減少外部干擾(並因此刪除鎖定):
lock (StartScale) {
// Calculate the scale factor to be applied.
var localCurrentScale = CurrentScale + (e.Scale - 1) * StartScale;
if(localCurrentScale <= 1)
{
CurrentScale = 1;
} else CurrentScale = localCurrentScale;
}
您可以使用Redgate Reflector或Telerik JustDecompile(免費)等工具來分析編譯的程序集(它非常易讀),並查看編譯期間的優化內容。
注意:StartScale是一個糟糕的鎖,但對於這個調試很好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.