всегда выгода попытки внешние вызовы ресурса?

Давайте попробуем это.

  • Создайте новый класс в Project, назовите его TPanel и вставьте в пользовательский класс Panel, который вы можете найти ниже, перезаписав существующее определение.
  • Скомпилируйте проект, затем найдите новый элемент управления TPanel в панели инструментов и поместите один экземпляр в форму.
    В форме , а не внутри одной из цветных панелей, иначе она станет дочерней для другого элемента управления и будет ограничена внутри своих границ.
  • Добавьте обработчик событий в событие Paint TPanel и вставьте этот код в метод обработчика:

Private Sub TPanel1_Paint(sender As Object, e As PaintEventArgs) Handles TPanel1.Paint
    Dim canvas As Control = DirectCast(sender, Control)
    Dim rect As Rectangle = ScaleImageFrame(imgBasketBall, canvas.ClientRectangle)

    e.Graphics.SmoothingMode = SmoothingMode.AntiAlias
    e.Graphics.CompositingMode = CompositingMode.SourceOver
    e.Graphics.PixelOffsetMode = PixelOffsetMode.Half
    e.Graphics.DrawImage(imgBasketBall, rect)
End Sub

Private Function ScaleImageFrame(sourceImage As Bitmap, destinationFrame As Rectangle) As Rectangle
    Dim rect As RectangleF = New RectangleF(0, 0, sourceImage.Width, sourceImage.Height)
    'Define the ratio between the Image Rectangle and the Container ClientRectangle
    Dim ratio As Single = CType(Math.Max(destinationFrame.Width, destinationFrame.Height) /
                                Math.Max(rect.Width, rect.Height), Single)
    rect.Size = New SizeF(rect.Width * ratio, rect.Height * ratio)
    'Use Integer division to avoid negative values
    rect.Location = New Point((destinationFrame.Width - CInt(rect.Width)) \ 2,
                              (destinationFrame.Height - CInt(rect.Height)) \ 2)
    Return Rectangle.Round(rect)
End Function
  • В Form, создайте экземпляр объекта Bitmap, который будет содержать изображение; также установите расположение панели ( TPanel )
    Элементы управления panColored1 и panColored2 должны быть имена двух существующих панелей, на которых должно быть расположено изображение. Пример кода размещает изображение в центре двух панелей, используя TPanel1.Location( (...) )

Private imgBasketBall As Bitmap = Nothing

Public Sub New()
    InitializeComponent()
    imgBasketBall = DirectCast(Image.FromFile("basketball.png").Clone(), Bitmap)
    TPanel1.Size = New Size(120, 120)
    TPanel1.Location = New Point(panColored1.Left + (panColored1.Width - TPanel1.Width) \ 2,
                                 panColored1.Top + (panColored1.Height + panColored2.Height - TPanel1.Height) \ 2)
    TPanel1.BringToFront()
End Sub

Результат:

Transparent Panel Scaled Image

      Bitmap Size           Bitmap Size 
      (1245x1242)           (1178x2000)

Класс TPanel (прозрачная панель):

Imports System.ComponentModel


Public Class TPanel
    Inherits Panel
    Private Const WS_EX_TRANSPARENT As Integer = &H20
    Public Sub New()
        Me.SetStyle(ControlStyles.AllPaintingInWmPaint Or
                    ControlStyles.UserPaint Or
                    ControlStyles.Opaque Or
                    ControlStyles.ResizeRedraw, True)
        Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, False)
        Me.UpdateStyles()
    End Sub

    Protected Overrides Sub OnPaint(e As PaintEventArgs)
        e.Graphics.FillRectangle(Brushes.Transparent, Me.ClientRectangle)
        MyBase.OnPaint(e)
    End Sub

    Protected Overrides ReadOnly Property CreateParams() As CreateParams
        Get
            Dim parameters As CreateParams = MyBase.CreateParams
            parameters.ExStyle = parameters.ExStyle Or WS_EX_TRANSPARENT
            Return parameters
        End Get
    End Property
End Class

8
задан Aaron Palmer 24 October 2008 в 11:55
поделиться

6 ответов

Поймайте только исключения, которые можно обработать. Так, например, при использовании внешних ресурсов, лучшая практика должна поймать определенные исключения, что Вы знаете, что можно обработать. В случае файлов это может быть (IOException, SecurityException, и т.д.), в случае Базы данных, исключением может быть SqlException или другие.

В любом случае не ловите исключения, что Вы не обрабатываете, позволяете им течь к верхнему уровню, который может. Или если по некоторым причинам Вы ловите исключения, но не обрабатываете их, повторно бросают их использующий просто бросьте; (который создаст перебросок IL op, в противоположность плоскодонке).

В случае использования ресурсов, которые Вы не знаете, какие исключения могли бы выдать, Вы отчасти вынуждены поймать общий тип исключительной ситуации. И в этом случае вещь сейфов состояла бы в том, чтобы использовать упомянутые ресурсы от другого домена приложения (если возможный), или позвольте пузырю исключения до верхнего уровня (исключая UI), где они могут быть отображены или зарегистрированы.

7
ответ дан 5 December 2019 в 12:14
поделиться

Я думаю, что существует три причины иметь блок выгоды:

  • Можно обработать исключение и восстановиться (с "низкоуровневого" кода)
  • Вы хотите повторно перенести исключение (снова из "низкоуровневого" кода)
  • Вы наверху стека, и в то время как Вы не можете восстановить саму операцию, Вы не хотите, чтобы целое приложение понизилось

Если Вы придерживаетесь их, у Вас должно быть очень немного блоков выгоды по сравнению с try/finally блоки - и они try/finally блоки почти всегда просто звонят Dispose, и поэтому лучше всего записанный как using операторы.

Нижняя строка: очень важно иметь a finally блок к бесплатным ресурсам, но catch блоки должны обычно быть более редкими.

3
ответ дан 5 December 2019 в 12:14
поделиться

У Eric Lippert есть хороший блог на этом, здесь.

Нет никакого смысла (за исключением того, "чтобы досаждать" (см. блог)) ловля исключения, если Вы не можете сделать что-то полезное; и в большинстве случаев Вы просто не можете - таким образом позволять ему пузырь (Ваш UI должен, очевидно, чистить и отобразить что-то).

У Вас могла бы, однако, быть "попытка/наконец" иметь дело с управлением ресурсами. Или даже инструмент для очистки, блок "использования", чтобы сделать то же.

2
ответ дан 5 December 2019 в 12:14
поделиться

Я думаю, что абсолютный ответ абсолютно условен (как управление делает Вы имеете по среде, что является ожидаемым балансом между производительностью и непротиворечивостью и многими другими, я уверен), но вообще говоря, я всегда делаю, предпочитая безопасность потенциально более медленной производительности.

0
ответ дан 5 December 2019 в 12:14
поделиться

это всегда зависит от того, чего Вы хотите достигнуть. Сервер, не отвечающий, мог бы быть достаточно серьезным для остановки всех, что стандартная программа, что выполнение, и исключение должно быть брошено в вызывающую сторону.

В других случаях Вы не заботитесь, не удалось ли Вам обновить дб или нет. Затем потребление исключения в порядке.

Очевидно, Вы не хотите показывать отслеживание стека своему конечному пользователю, тем не менее, таким образом, необходимо будет поймать его где-нибудь.

0
ответ дан 5 December 2019 в 12:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: