万本电子书0元读

万本电子书0元读

顶部广告

Improving your C# Skills电子书

售       价:¥

1人正在读 | 0人评论 9.8

作       者:Ovais Mehboob Ahmed Khan

出  版  社:Packt Publishing

出版时间:2019-02-26

字       数:68.1万

所属分类: 进口书 > 外文原版书 > 电脑/网络

温馨提示:数字商品不支持退换货,不提供源文件,不支持导出打印

为你推荐

  • 读书简介
  • 目录
  • 累计评论(0条)
  • 读书简介
  • 目录
  • 累计评论(0条)
Conquer complex and interesting programming challenges by building robust and concurrent applications with caches, cryptography, and parallel programming. Key Features * Understand how to use .NET frameworks like the Task Parallel Library (TPL)and CryptoAPI * Develop a containerized application based on microservices architecture * Gain insights into memory management techniques in .NET Core Book Description This Learning Path shows you how to create high performing applications and solve programming challenges using a wide range of C# features. You’ll begin by learning how to identify the bottlenecks in writing programs, highlight common performance pitfalls, and apply strategies to detect and resolve these issues early. You'll also study the importance of micro-services architecture for building fast applications and implementing resiliency and security in .NET Core. Then, you'll study the importance of defining and testing boundaries, abstracting away third-party code, and working with different types of test double, such as spies, mocks, and fakes. In addition to describing programming trade-offs, this Learning Path will also help you build a useful toolkit of techniques, including value caching, statistical analysis, and geometric algorithms. This Learning Path includes content from the following Packt products: * C# 7 and .NET Core 2.0 High Performance by Ovais Mehboob Ahmed Khan * Practical Test-Driven Development using C# 7 by John Callaway, Clayton Hunt * The Modern C# Challenge by Rod Stephens What you will learn * Measure application performance using BenchmarkDotNet * Leverage the Task Parallel Library (TPL) and Parallel Language Integrated Query (PLINQ)library to perform asynchronous operations * Modify a legacy application to make it testable * Use LINQ and PLINQ to search directories for files matching patterns * Find areas of polygons using geometric operations * Randomize arrays and lists with extension methods * Use cryptographic techniques to encrypt and decrypt strings and files Who this book is for If you want to improve the speed of your code and optimize the performance of your applications, or are simply looking for a practical resource on test driven development, this is the ideal Learning Path for you. Some familiarity with C# and .NET will be beneficial.
目录展开

Title Page

Copyright and Credits

Improving your C# Skills

About Packt

Why subscribe?

Packt.com

Contributors

About the authors

Packt is searching for authors like you

Preface

Who this book is for

What this book covers

To get the most out of this book

Download the example code files

Conventions used

Get in touch

Reviews

What's New in .NET Core 2 and C# 7?

Evolution of .NET

New improvements in .NET Core 2.0

Performance improvements

RyuJIT compiler in .NET Core

Profile guided optimization

Simplified packaging

Upgrading path from .NET Core 1.x to 2.0

1. Install .NET Core 2.0

2. Upgrade TargetFramework

3. Update .NET Core SDK version

4. Update .NET Core CLI

Changes in ASP.NET Core Identity

Exploring .NET Core CLI and New Project Templates

Understanding .NET Standard

Versioning of .NET Standard

New improvements in .NET Standard 2.0

More APIs in .NET Standard 2.0

Compatibility mode

Creating a .NET Standard library

What comes with ASP.NET Core 2.0

ASP.NET Core Razor Pages

Automatic Page and View compilation on publishing

Razor support for C# 7.1

Simplified configuration for Application Insights

Pooling connections in Entity Framework Core 2.0

New features in C# 7.0

Tuples

Patterns

Constant pattern

Type pattern

Var pattern

Reference returns

Expression bodied member extended

Creating Local Functions

Out variables

Async Main

Writing quality code

Summary

Understanding .NET Core Internals and Measuring Performance

.NET Core internals

CoreFX

CoreCLR

Understanding MSIL, CLI, CTS, and CLS

How the CLR works

From compilation to execution – Under the hood

Garbage collection

Generations in GC

.NET Native and JIT compilation

Utilizing multiple cores of the CPU for high performance

How releasing builds increases performance

Benchmarking .NET Core 2.0 applications

Exploring BenchmarkDotNet

How it works

Setting parameters

Memory diagnostics using BenchmarkDotnet

Adding configurations

Summary

Multithreading and Asynchronous Programming in .NET Core

Multithreading versus asynchronous programming

Multithreading in .NET Core

Multithreading caveats

Threads in .NET Core

Creating threads in .NET Core

Thread lifetime

The thread pool in .NET

Thread synchronization

Monitors

Task parallel library (TPL)

Creating a task using TPL

Task-based asynchronous pattern (TAP)

Naming convention

Return type

Parameters

Exceptions

Task status

Task cancellation

Task progress reporting

Implementing TAP using compilers

Implementing TAP with greater control over Task

Design patterns for parallel programming

Pipeline pattern

Dataflow pattern

Producer/consumer pattern

Parallel.ForEach

Parallel LINQ (PLINQ)

Summary

Securing and Implementing Resilience in .NET Core Applications

Introduction to resilient applications

Resilient policies

Reactive policies

Implementing the retry pattern

Implementing circuit breaker

Wrapping the circuit breaker with retry

Fallback policy with circuit breaker and retry

Proactive policies

Implementing timeout

Implementing caching

Implementing health checks

Storing sensitive information using Application Secrets

Protecting ASP.NET Core APIs

SSL (Secure Socket Layer)

Enabling SSL in an ASP.NET Core application

Preventing CSRF (Cross-Site Request Forgery) attacks

Reinforcing security headers

Adding the HTTP strict transport security header

Adding the X-Content-Type-Options header

Adding the X-Frame-Options header

Adding the X-Xss-Protection header

Adding the Content-Security-Policy header

Adding the referrer-policy header

Enabling CORS in the ASP.NET Core application

Authentication and authorization

Using ASP.NET Core Identity for authentication and authorization

Authentication

Authorization

Implementing authentication and authorization using the ASP.NET Core Identity framework

Adding more properties in the user table

Summary

Why TDD is Important

First, a little background

John's story on TDD

Clayton's story on TDD

So, what is TDD?

An approach to TDD

An alternative approach

The process

Red, green, and refactor

Coder's block

Why should we care?

Arguments against TDD

Testing takes time

Testing is expensive

Testing is difficult

We don't know how

Arguments in favor of TDD

Reduces the effort of manual testing

Reduces bug count

Ensures some level of correctness

Removes the fear of refactoring

A better architecture

Faster development

Different types of test

Unit tests

Acceptance tests

Integration tests

End to end tests

Quantity of each test type

Parts of a unit test

Arrange

Act

Assert

Requirements

Why are they important?

User stories

Role

Request

Reason

Gherkin

Givens

When

Then

Our first tests in C#

Growing the application with tests

Our first tests in JavaScript

Why does it matter?

Summary

Setting Up the .NET Test Environment

Installing the .NET Core SDK

Getting set up with VS Code

Downloading the IDE

Installing the VS Code

Adding extensions

Creating a project in VS Code

Setting up Visual Studio Community

Downloading Visual Studio Community

Installing Visual Studio Community

Switching to xUnit

Code katas

FizzBuzz

Creating the test project

The Given3ThenFizz test

The Given5ThenBuzz test

The Given15ThenFizzBuzz test

The Given1Then1 test

Theories

Solution to the FizzBuzz Problem

What is Speaker Meet?

Web API project

Listing Speakers (API)

Requirements

A new test file

Summary

Setting Up a JavaScript Environment

Node.js

What is Node?

Why do we need Node?

Installing Node

Linux

Mac OSX

Windows

NPM

What is NPM?

Why do we need NPM?

Installing NPM?

A quick introduction to JavaScript IDEs

Visual Studio Code

Why Visual Studio Code?

Installing Visual Studio Code

Linux

Mac

Windows

Installing the plugins you will need

Configuring the testing environment

WebStorm

Why WebStorm?

Installing WebStorm

Linux

Mac

Windows

Installing the plugins you will need

Configuring the testing environment

Create React App

What is Create React App?

Installing the global module

Creating a React application

Running the Create React App script

Mocha and Chai

Jest

Mocha

Chai

Sinon

Enzyme

Ejecting the React app

Configuring to use Mocha and Chai

A quick kata to check our test setup

The requirements

The execution

Starting the kata

Summary

What to Know Before Getting Started

Untestable code

Dependency Injection

Static

Singleton

Global state

Abstracting third-party software

Test doubles

Mocking frameworks

The SOLID principles

The Single Responsibility Principle

The Open/Closed principle

The Liskov Substitution principle

The Interface Segregation Principle

The Dependency Inversion principle

Timely greeting

Fragile tests

False positives and false failures

Abstract DateTime

Test double types

Dummies

Dummy logger

Example in C#

Example in JavaScript

Stubs

Example in C#

Example in JavaScript

Spies

Example in C#

Example in JavaScript

Mocks

Example in C#

Example in JavaScript

Fakes

Example in C#

Example in JavaScript

N-Tiered example

Presentation layer

Moq

Business layer

Summary

Tabula Rasa – Approaching an Application with TDD in Mind

Where to begin

Yak shaving

Big design up front

A clean slate

One bite at a time

Minimum Viable Product

Different mindset

YAGNI – you aren't gonna need it

Test small

Devil's advocate

Test negative cases first

When testing is painful

A spike

Assert first

Stay organized

Breaking down Speaker Meet

Speakers

Communities

Conferences

Technical requirements

Summary

Testing JavaScript Applications

Creating a React app

Ejecting the app

Configuring Mocha, Chai, Enzyme, and Sinon

The plan

Considering the React component

Looking at Redux testability

The store

Actions

Reducers

Unit-testing an API service

Speaker listing

A mock API service

The Get All Speakers action

Testing a standard action

Testing a thunk

The Get All Speakers reducer

The Speaker listing component

Speaker detail

Adding to the mock API Service

The Get Speaker action

The Get Speaker reducer

The Speaker Detail component

Summary

Exploring Integrations

Implementing a real API service

Replacing the mock API with the real API service

Using Sinon to mock Ajax responses

Fixing existing tests

Mocking the server

Application configuration

End-to-end integration tests

Benefits

Detriments

How much end-to-end testing should you do?

Configuring the API project

Integration test project

Where to begin?

Verifying the repository calls into the DB context

InMemory database

Adding speakers to the InMemory database

Verify that the service calls the DB through the repository

ContextFixture

Verify the API calls into the service

TestServer

ServerFixture

Summary

Changes in Requirements

Hello World

A change in requirements

Good evening

FizzBuzz

A new feature

Number not found

TODO app

Mark complete

Adding tests

Production code

But don't remove from the list!

Adding tests

Production code

Changes to Speaker Meet

Changes to the back-end

Changes to the front-end

Sorted by rating on client side

What now?

Premature optimization

Summary

The Legacy Problem

What is legacy code?

Why does code go bad?

When does a project become a legacy?

What can be done to prevent legacy decay?

Typical issues resulting from legacy code

Unintended side effects

Open Closed Principle and legacy code

Liskov Substitution Principle and legacy code

Over-optimization

Overly clever code

Tight coupling to third-party software

Issues that prevent adding tests

Direct dependence on framework and third-party code

Law of Demeter

Work in the constructor

Global state

Static methods

Large classes and functions

Dealing with legacy problems

Safe refactoring

Converting values to variables

Extracting a method

Extracting a class

Abstracting third-party libraries and framework code

Early tests

Gold standard tests

Testing all potential outcomes

Moving forward

Fixing bugs

Free to do unsafe refactoring

Summary

Unraveling a Mess

Inheriting code

The game

A change is requested

Life sometimes hands you lemons

Getting started

Abstracting a third-party class

Unexpected Input

Making sense of the madness

Final beautification

Ready for enhancements

Summary

Geometry

Problems

1. Monte Carlo π

2. Newton's π

3. Bisection root-finding

4. Newton's method

5. Gaussian elimination

6. Monte Carlo integration

7. Rectangle rule integration

8. Trapezoid rule integration

9. Arrowheads

10. Line-line intersection

11. Point-line distance

12. Point-segment distance

13. Segment-segment distance

14. Circle selection

15. Line-circle intersection

16. Circle-circle intersection

17. Circle-line tangents

18. Polygon area

19. Point in a polygon

20. Convexity testing

21. Stars

Solutions

1. Monte Carlo π

2. Newton's π

3. Bisection root-finding

4. Newton's method

5. Gaussian elimination

6. Monte Carlo integration

7. Rectangle rule integration

8. Trapezoid rule integration

9. Arrowheads

10. Line-line intersection

11. Point-line distance

12. Point-segment distance

13. Segment-segment distance

14. Circle selection

15. Line-circle intersection

16. Circle-circle intersection

17. Circle-line tangents

18. Polygon area

19. Point in a polygon

20. Convexity testing

21. Stars

Summary

Randomization

Problems

22. Random doubles

23. Random items

24. Randomize items

25. Random groups

26. Choose items with probabilities

27. Random passwords

28. Random walks

Solutions

22. Random doubles

23. Random items

24. Randomize items

25. Random groups

26. Choose items with probabilities

27. Random passwords

28. Random walks

Summary

Files and Directories

Problems

29. Removing blank lines

30. Directory size

31. Finding duplicate files

32. Thumbnails

33. Thumbnail web page

34. Find files

35. Find and Replace

36. Saving images

37. Compressing images

Solutions

29. Removing blank lines

30. Directory size

31. Finding duplicate files

32. Thumbnails

33. Thumbnail web page

34. Find files

35. Find and Replace

36. Saving images

37. Compressing images

Summary

Advanced C# and .NET Features

Problems

38. Directory size, LINQ style

39. Directory size, PLINQ style

40. Find files, LINQ style

41. Parallel Monte Carlo π

42. Yielding primes

43. Yielding Fibonacci numbers

44. Complex numbers

Solutions

38. Directory size, LINQ style

39. Directory size, PLINQ style

40. Find files, LINQ style

41. Parallel Monte Carlo π

42. Yielding primes

43. Yielding Fibonacci numbers

44. Complex numbers

Summary

Cryptography

Problems

45. Caesar cipher

46. Vigenère cipher

47. Cryptographic pseudorandom numbers

48. Find primes

49. Hash files

50. Steganography

51. Encrypt and decrypt strings

52. Encrypt and decrypt files

53. CryptoPad

Solutions

45. Caesar cipher

46. Vigenère cipher

47. Cryptographic random numbers

48. Find primes

49. Hash files

50. Steganography

51. Encrypt and decrypt strings

52. Encrypt and decrypt files

53. CryptoPad

Summary

Other Books You May Enjoy

Leave a review - let other readers know what you think

累计评论(0条) 0个书友正在讨论这本书 发表评论

发表评论

发表评论,分享你的想法吧!

买过这本书的人还买过

读了这本书的人还在读

回顶部